/* General Queen's board Ohjelma etsii kaikki ratkaisut yleistettyyn "Kuningattaren lauta" -ongelmaan: sijoitettava NxN taulukkoon N merkkiä siten, että millään rivillä, sarakkeella tai diagonaalilla ei ole enempää kuin yksi. Argumentteina annetaan laudan koko (N) ja kuinka monta ratkaisua enintään halutaan tulostaa (oletus 0, jolloin tulostetaan vain ratkaisujen määrä). */ #include #include // adjust ROWTYPE for bigger boards #ifndef ROWTYPE #define ROWTYPE int #endif typedef ROWTYPE Row; #define MAXSIZE (8*sizeof(Row)) static int printing; // how many left to print void usage(char *name) { fprintf(stderr,"Usage: %s N [P]\n" " N = board size (max %u)\n" " P = max number of solutions to print (default: print solution count only)\n", name,(unsigned)MAXSIZE); exit(1); } // print one row (as binary number but with _=0, Q=1) void printrow(Row x, int n) { if (--n) printrow(x>>1, n); fwrite(" _ Q"+(2*x&2),1,2,stdout); } // print the board void printboard(Row *board, int size) { int i; for (i=0; i 0) printboard(board,size); } } } while (board[row] >>= 1); // next column return count; } int main(int argc, char ** argv) { int size; Row board[MAXSIZE]; if (argc < 2 || argc > 3 || sscanf(argv[1],"%d",&size) != 1 || size < 1 || size > MAXSIZE) { usage(argv[0]); } (void)(argc > 2 && sscanf(argv[2],"%d",&printing)); printf("Found %d solutions\n", queens(board,size,0,0,0,0)); return 0; }