1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| #define ROW_NUM 9 #define COLUMN_NUM 9
int CalBitSolution(int buf[ROW_NUM][COLUMN_NUM], int rowIdx, int columnIdx) { int val[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int j = 0; j < COLUMN_NUM; j++) { if (buf[rowIdx][j] != 0) { int tmp = buf[rowIdx][j]; val[tmp - 1] = 0; } }
for (int i = 0; i < ROW_NUM; i++) { if (buf[i][columnIdx] != 0) { int tmp = buf[i][columnIdx]; val[tmp - 1] = 0; } }
for (int i = (rowIdx / 3) * 3; i < (rowIdx / 3 + 1) * 3; i ++) { for (int j = (columnIdx / 3) * 3; j < (columnIdx / 3 + 1) * 3; j++) { if (buf[i][j] != 0) { int tmp = buf[i][j]; val[tmp - 1] = 0; } } }
int ret = 0; for (int i = 0; i < sizeof(val) / sizeof(val[0]); i++) { if (ret == 0 && val[i] != 0) { ret = val[i]; } else if (ret != 0 && val[i] != 0) { return 0; } }
return ret; }
void Solution2Sudoku(int buf[ROW_NUM][COLUMN_NUM]) { int flag = 1; for (int i = 0; i < ROW_NUM; i++) { for (int j = 0; j < COLUMN_NUM; j++) { if (buf[i][j] == 0) { flag = 0; int ret = CalBitSolution(buf, i, j); if (ret != 0) { buf[i][j] = ret; } } } }
if (flag == 1) { return; } else { Solution2Sudoku(buf); } }
int main() { int buf[ROW_NUM][COLUMN_NUM] = {0}; for (int i = 0; i < ROW_NUM; i++) { char tmp[10] = {0}; scanf("%s", tmp); for (int j = 0; j < COLUMN_NUM; j++) { buf[i][j] = tmp[j] -'0'; } }
Solution2Sudoku(buf);
int flag = 1; for (int i = 0; i < ROW_NUM; i++) { for (int j = 0; j < COLUMN_NUM; j++) { printf("%d ", buf[i][j]); } printf("\n"); }
system("pause");
return 0; }
|