/* Article 19637 (318 more) in rec.games.chess: From: jmurphy@athens.Princeton.EDU (Jerald Murphy) Subject: Eight Queens problem Message-ID: <1993Apr16.202749.11830@Princeton.EDU> Originator: news@nimaster Sender: jmurphy@athens (Jerald Murphy) Nntp-Posting-Host: athens.princeton.edu Organization: Princeton University Date: Fri, 16 Apr 1993 20:27:49 GMT Lines: 144 Here it is in c: Modified to do boards of different sizes and display files by Warren Porter */ int *up, *down, *rank, *x; unsigned int max=8, max2=16, max_less_1=7; long int count=0; print() { int k; for (k = 0; k < max; k++) { printf(" %c%d", k + 97,x[k] + 1); } printf("\n"); count++; } queens(int c) { int r; for (r = 0; r < max; r++) if (rank[r] == 0 && up[r-c+max_less_1] == 0 && down[r+c] == 0) { rank[r] = 1; up[r-c+max_less_1] = 1; down[r+c] = 1; x[c] = r; if (c == max_less_1) print(); else queens(c + 1); rank[r] = 0; up[r-c+max_less_1] = 0; down[r+c] = 0; } } main(int argc,char *argv[]) { int i; if (argc > 1) max=atoi(argv[1]),max2=max*2,max_less_1=max - 1; up=(int *)calloc(max2,sizeof(int)); down=(int *)calloc(max2,sizeof(int)); rank=(int *)calloc(max,sizeof(int)); x=(int *)calloc(max,sizeof(int)); for (i = 0; i < max2; i++) up[i] = down[i] = 0; for (i = 0; i < max; i++) rank[i] = x[i] = 0; queens(0); printf("\n There were %ld solutions for %d * %d\n",count,max,max); }