1
感受:这个题简直无情,recursive backtracking 终于对了。
reference http://see.stanford.edu/materials/icspacs106b/H19-RecBacktrackExamples.pdf
1033.数独游戏
【输入格式】
一个9×9的矩阵(数字之间没有空格)0代表初始时没有数字,1-9代表初始时的数字
【输出格式】
一个 9×9 的矩阵,表示输入矩阵的解。(输入数据保证有且只有一个解)
【样例输入】
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400
【样例输出】
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452
【数据规模和约定】
输入数据中每一个数字都是1~9之间的一个数字。
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 5 struct Grid{ 6 int a[9][9]; 7 }; 8 9 bool FindUnassignedLocation(Grid &grid,int &i, int &j) 10 { 11 for (i = 0; i < 9; i++) 12 for (j = 0; j < 9; j++) 13 if (grid.a[i][j] == 0) return true; 14 return false; 15 } 16 17 bool UsedInRow(Grid &grid,int row,int col, int num) 18 { 19 for (int j = 0; j < 9; j++) 20 if (grid.a[row][j] == num) return true; 21 return false; 22 } 23 24 bool UsedInCol(Grid &grid,int row,int col, int num) 25 { 26 for (int i = 0; i < 9; i++) 27 if (grid.a[i][col] == num) return true; 28 return false; 29 } 30 31 bool UsedInSubGrid(Grid &grid,int row,int col, int num) 32 { 33 for (int i = row; i < row + 3; i++) 34 for (int j = col; j < col + 3; j++) 35 if (grid.a[i][j] == num) return true; 36 return false; 37 } 38 39 bool NoConflicts(Grid &grid,int row,int col, int num) 40 { 41 return !UsedInRow(grid,row,col,num) && !UsedInCol(grid,row,col,num) 42 && !UsedInSubGrid(grid,row - row % 3, col - col % 3, num); 43 } 44 45 bool SolveSudoku(Grid &grid) 46 { 47 int row, col; 48 if (!FindUnassignedLocation(grid,row,col)) return true; // BASE CASE 49 50 for (int num = 1; num <= 9; num++) 51 { 52 if (NoConflicts(grid,row,col,num)) 53 { 54 grid.a[row][col] = num; 55 if (SolveSudoku(grid)) return true; 56 else 57 grid.a[row][col] = 0; 58 } 59 } 60 return false; 61 } 62 63 void output(Grid& grid) 64 { 65 for (int i = 0; i < 9; i++) 66 for (int j = 0; j < 9; j++) 67 { 68 cout << grid.a[i][j]; 69 if (j == 8) cout << endl; 70 } 71 } 72 73 int main() 74 { 75 //ifstream cin("input.txt"); 76 Grid grid; //a[9][9] 77 for (int i = 0; i < 9; i++) 78 for (int j = 0; j < 9; j++) 79 { 80 char digit; 81 cin >> digit; 82 grid.a[i][j] = digit - '0'; 83 } 84 85 bool status = SolveSudoku(grid); 86 output(grid); 87 return 0; 88 }