C 263 264 283 309
편집 약간의 바이트는 @ 피터 테일러 thx를 절약-내가 원하는 것보다 적습니다. 그런 다음 2 바이트가 더 많은 메모리를 할당하는 데 사용되었으므로 이제 더 큰 크기를 시도 할 수 있지만 시간이 많이 걸립니다.
참고 설명을 추가하는 동안 R 배열에 그리드를 유지하는 바이트를 낭비하고 있음을 알았습니다. 그래서 찾은 솔루션을 볼 수 있습니다 ...이 도전에 대한 요청은 없습니다!
골프 버전에서 제거했습니다
합리적인 시간에 n = 1..10에 대한 답을 실제로 찾을 수있는 골프 C 프로그램.
s,k,n,V[9999],B[9999],i,b;K(l,w,u,t,i){for(t=u&t|u*2&t*4|u/2&t/4,--l; i--;)V[i]&t||(b=B[i]+w,l?b+(n+2)/3*2*l>s&&K(l,b,V[i],u,k):b>s?s=b:0);}main(v){for(scanf("%d",&n);(v=V[i]*2)<1<<n;v%8<6?B[V[k]=v+1,k++]=b+1:0)V[k]=v,b=B[k++]=B[i++];K(n,0,0,0,k);printf("%d",s);}
내 테스트 :
7-> 26 초 10 초
8-> 36 초 18 초
9-> 42 인치 1162 초
덜 골프 와 설명하려고
#include <stdio.h>
int n, // the grid size
s, // the result
k, // the number of valid rows
V[9999], // the list of valid rows (0..to k-1) as bitmasks
B[9999], // the list of 'weight' for each valid rows (number of set bits)
R[99], // the grid as an array of indices pointing to bitmask in V
b,i; // int globals set to 0, to avoid int declaration inside functions
// recursive function to fill the grid
int K(
int l, // number of rows filled so far == index of row to add
int w, // number of crosses so far
int u, // bit mask of the preceding line (V[r[l-1]])
int t, // bit mask of the preceding preceding line (V[r[l-2]])
int i) // the loop variables, init to k at each call, will go down to 0
{
// build a bit mask to check the next line
// with the limit of 3 crosses we need to check the 2 preceding rows
t = u&t | u*2 & t*4 | u/2 & t/4;
for (; i--; )// loop on the k possibile values in V
{
R[l] = i; // store current row in R
b = B[i] + w; // new number of crosses if this row is accepted
if ((V[i] & t) == 0) // check if there are not 3 adjacent crosses
// then check if the score that we can reach from this point
// adding the missing rows can eventually be greater
// than the current max score stored in s
if (b + (n + 2) / 3 * 2 * (n - l - 1) > s)
if (l > n-2) // if at last row
s = b > s ? b : s; // update the max score
else // not the last row
K(l + 1, b, V[i], u, k); // recursive call, try to add another row
}
}
int main(int j)
{
scanf("%d", &n);
// find all valid rows - not having more than 2 adjacent crosses
// put valid rows in array V
// for each valid row found, store the cross number in array B
// the number of valid rows will be in k
for (; i<1 << n; V[k] = i++, k += !b) // i is global and start at 0
for (b = B[k] = 0, j = i; j; j /= 2)
b = ~(j | -8) ? b : 1, B[k] += j & 1;
K(0,0,0,0,k); // call recursive function to find the max score
printf("%d\n", s);
}