#include #include #ifndef N #define N 5 #endif #define TS ((N-1)*N+1) #define WORDC ((TS+sizeof(int)-1)/sizeof(int)) #define OFFSET(x) ((x)/32) #define INDEX(x) ((x)&31) #define ISSET(x) ((ts[OFFSET(x)]&(1<=0;k--){ cur_sum+=db[row][k]; if(cur_sum0;k--){ cur_sum-=db[row][k]; set_unused(cur_sum); } return 0; } return 1; } void reverse(int r, int c) { int i; for(i=0;i=TS||ISSET(sum)){ goto restore_state; } set_used(sum); } for(;j=TS||ISSET(sum)){ goto restore_state; } set_used(sum); } } for(i=r2;i=r2;i--){ for(j=0;;j++){ db[i+1][j]=db[i][j]; if(db[i][j]==0)break; } } cc++;du--; for(i=0;i<=c1;i++){ int sum=0; for(j=i;j<=c1;j++)sum+=db[r1][j]; if(i=0;k--){ cur_sum+=db[row][k]; set_unused(cur_sum); } } void right_unset(int row, int rc) { int cur_sum=sel; int k; for(k=0;k=0;k--)db[i][k+1]=db[i][k];db[i][0]=sel; du++; try_next(); sel=try_sel;du--; for(k=0;k<=j;k++)db[i][k]=db[i][k+1]; right_unset(i,j); } } for(i=0;i1){ if(merge_test(i,ri,j,rj,1,-1)){ try_next(); sel=try_sel; merge_revert(i,ri,j,rj,1,-1); } } if(ri>1){ if(merge_test(i,ri,j,rj,-1,1)){ try_next(); sel=try_sel; merge_revert(i,ri,j,rj,-1,1); } } if(ri>1&&rj>1){ if(merge_test(i,ri,j,rj,-1,-1)){ try_next(); sel=try_sel; merge_revert(i,ri,j,rj,-1,-1); } } } } set_unused(sel); } int main() { init(); try_next(); return 0; }