#define DBG #include #include #include #include #include #define NMAX 50 #define NNMAX 395 /* = NMAX^2 - 5 */ struct { int x,y,d2,d3; } a[NNMAX]; int inext[NNMAX]; struct { int x,y; } f0[NMAX]; int t0[NMAX], /* t0[c] = 0..n^2-7 */ t1[NMAX], /* t1[c] = 0..k */ t2[NMAX], /* t2[c] = 0..k */ c0,c1,c2, d1_f0[NMAX+1], d1_f1[NMAX], d1_f2[NMAX], d2_f0[2*NMAX], d2_f1[2*NMAX], d2_f2[2*NMAX], d3_f0[2*NMAX], d3_f1[2*NMAX], d3_f2[2*NMAX], k,n, /* 3k in n x n */ nmk,imax; int not_end; FILE *OUT, *data; char out[20]; clock_t start; #ifdef DBG unsigned long tf0,tf1; #endif void init(void); void FASE0(void); void FASE1(void); void FASE2(void); void print_sol(void); void to_exit(void); void quit(int); int read_data(void); void write_data(void); void clear_data(void); int main(int argc, char *argv[]) { #ifdef DBG tf0=tf1=0; if (argc==1) { n=8; k=8; OUT=NULL; } else #endif if (argc<3) { printf("Usage: %s n k [file]\n", argv[0]); return 0; } else { n=atoi(argv[1]); k=atoi(argv[2]); if (argc>=4) OUT=fopen(strcpy(out,argv[3]),"w"); else OUT=NULL; } signal(SIGINT,quit); /* trap ctrl-c call quit fn */ not_end=1; start = clock(); if (!read_data()) { init(); c0=0; t0[0]=-1; } FASE0(); to_exit(); return 0; } void init(void) { int i,ix,iy,in; k--; nmk=n-k; i=0; in = n-3 -2; for (iy=2; iy<=n-3; iy++) { a[i].x =0; a[i].y =iy; a[i].d2=iy-2; a[i].d3=-iy+n-3; inext[i++]=in; } in+= n-2 -1 +1; for (iy=1; iy<=n-2; iy++) { a[i].x =1; a[i].y =iy; a[i].d2=1+iy-2; a[i].d3=1-iy+n-3; inext[i++]=in; } for (ix=2; ix<=n-3; ix++) { in+= n-1 +1; for (iy=0; iy<=n-1; iy++) { a[i].x =ix; a[i].y =iy; a[i].d2=ix+iy-2; a[i].d3=ix-iy+n-3; inext[i++]=in; } } in+= n-2 -1 +1; for (iy=1; iy<=n-2; iy++) { a[i].x =n-2; a[i].y =iy; a[i].d2=n-2+iy-2; a[i].d3=n-2-iy+n-3; inext[i++]=in; } in+= n-3 -2 +1; for (iy=2; iy<=n-3; iy++) { a[i].x =n-1; a[i].y =iy; a[i].d2=n-1+iy-2; a[i].d3=n-1-iy+n-3; inext[i++]=in; } a[i].y = n; a[i].d2= 2*n-5; a[i].d3= 2*n-5; imax=i; for (i=0; i<=n; i++) d1_f0[i] = 0; for (i=0; i<=2*n; i++) { d2_f0[i] = 0; d3_f0[i] = 0; } /* implies that: * d1_f0[a[imax]].y is 0 * and d1_f0[a[imax]].d2 is 0 * and d1_f0[a[imax]].d3 is 0 */ } void FASE0(void) { int i; while (not_end) { do t0[c0]++; while (d1_f0[a[t0[c0]].y] || d2_f0[a[t0[c0]].d2] || d2_f0[(a[t0[c0]].d2+n)%(2*n-1)-1] || d3_f0[(a[t0[c0]].d3+n)%(2*n-1)-1] || d3_f0[a[t0[c0]].d3]); if (t0[c0]a[t0[c0]].x-c0) { /* nmk is n-k; */ d1_f0[a[t0[c0]].y ]++; d2_f0[a[t0[c0]].d2]++; d3_f0[a[t0[c0]].d3]++; if (c0