FilesSubmittedBranchesLabelsClientsUsersJobsHelp
Tree viewShow file textShow revision historyShow/hide recent activityInformation
//depot/projects/sudoku/fast/sudoku.c

Diffs between #1 and #2

@@ -4,6 +4,8 @@
44 * Because everyone on the SkyTrain is doing these now and I refuse
55 * to do them by hand. -- ksimpson, may 2005
66 *
7 * fast branch: bitmasks instead of scanning. -- zz9
8 *
79 * usage: sudoku [puzzle.txt]
810 * puzzle is 9 lines of 9 chars, digits or '.' for blanks
911 */
@@ -14,23 +16,31 @@
1416static int grid[9][9];
1517static long nodes = 0;
1618
17static int ok(int r, int c, int v)
19static unsigned short rows[9], cols[9], boxes[9];
20
21#define BOX(r, c) (((r) / 3) * 3 + (c) / 3)
22
23static void place(int r, int c, int v)
1824{
19 int i, br, bc;
25 grid[r][c] = v;
26 rows[r] |= 1 << v;
27 cols[c] |= 1 << v;
28 boxes[BOX(r, c)] |= 1 << v;
29}
2030
21 for (i = 0; i < 9; i++) {
22 if (grid[r][i] == v || grid[i][c] == v)
23 return 0;
24 }
25 br = (r / 3) * 3;
26 bc = (c / 3) * 3;
27 for (i = 0; i < 9; i++) {
28 if (grid[br + i / 3][bc + i % 3] == v)
29 return 0;
30 }
31 return 1;
31static void unplace(int r, int c, int v)
32{
33 grid[r][c] = 0;
34 rows[r] &= ~(1 << v);
35 cols[c] &= ~(1 << v);
36 boxes[BOX(r, c)] &= ~(1 << v);
3237}
3338
39static int ok(int r, int c, int v)
40{
41 return !((rows[r] | cols[c] | boxes[BOX(r, c)]) & (1 << v));
42}
43
3444static int solve(int pos)
3545{
3646 int r, c, v;
@@ -44,10 +54,10 @@
4454 for (v = 1; v <= 9; v++) {
4555 nodes++;
4656 if (ok(r, c, v)) {
47 grid[r][c] = v;
57 place(r, c, v);
4858 if (solve(pos + 1))
4959 return 1;
50 grid[r][c] = 0;
60 unplace(r, c, v);
5161 }
5262 }
5363 return 0;
@@ -87,6 +97,7 @@
8797int main(int argc, char **argv)
8898{
8999 FILE *f = stdin;
100 int i;
90101
91102 if (argc > 1 && !(f = fopen(argv[1], "r"))) {
92103 perror(argv[1]);
@@ -96,6 +107,10 @@
96107 fprintf(stderr, "sudoku: need 9 rows\n");
97108 return 1;
98109 }
110 for (i = 0; i < 81; i++) {
111 if (grid[i / 9][i % 9])
112 place(i / 9, i % 9, grid[i / 9][i % 9]);
113 }
99114 if (!solve(0)) {
100115 printf("no solution (are you sure you copied it right?)\n");
101116 return 1;

P4Web/LINUX26X86/2005.1/82295 · Copyright © 1995-2005 Perforce Software · ttul.org