這題拿ACM 989的code改一改就可以上傳了XD
#include <stdio.h>
int quit, found, board[9][9], row_used[9][10], col_used[9][10], block_used[3][3][10];
void sudoku(int x, int y)
{
int i, j;
if (y == 9) {
++x;
y = 0;
}
if (x == 9) {
if (found) // If we have already found a solution
quit = 1; // then stop solving the puzzle
found = 1;
return;
}
if (!quit && board[x][y]) {
sudoku(x, y+1);
return;
}
for (i = 1; !quit && i <= 9; ++i)
if (!row_used[x][i] && !col_used[y][i]
&& !block_used[x/3][y/3][i]) {
row_used[x][i] = col_used[y][i]
= block_used[x/3][y/3][i] = 1;
board[x][y] = i;
sudoku(x, y+1);
board[x][y] = 0;
row_used[x][i] = col_used[y][i]
= block_used[x/3][y/3][i] = 0;
}
}
int main(void)
{
int i, j, k, first, dont_do, count;
count = 1;
while (1) {
found = dont_do = quit = 0;
for (i = 0; i < 9; ++i)
for (j = 1; j <= 9; ++j)
row_used[i][j] = col_used[i][j] = 0;
for (i = 0; i < 3; ++i)
for (j = 0; j < 3; ++j)
for (k = 1; k <= 9; ++k)
block_used[i][j][k] = 0;
for (i = 0; i < 9; ++i)
for (j = 0; j < 9; ++j) {
if (scanf("%d", &board[i][j]) != 1)
return 0;
if (board[i][j]
&& (row_used[i][board[i][j]]
|| col_used[j][board[i][j]]
|| block_used[i/3][j/3][board[i][j]]))
dont_do = 1;
row_used[i][board[i][j]] = 1;
col_used[j][board[i][j]] = 1;
block_used[i/3][j/3][board[i][j]] = 1;
}
printf("Case %d: ", count++);
if (!dont_do)
sudoku(0, 0);
else {
printf("Illegal.\n");
continue;
}
if (!found)
printf("Impossible.\n");
else if (quit)
printf("Ambiguous.\n");
else
printf("Unique.\n");
}
return 0;
}
沒有留言:
張貼留言