题目描述
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
解法1:回溯
1.同样建立3个数组row,col,box 表示行,列,宫
2.将本来存在的数字在对应行,列,宫中存下
3.开始回溯插入
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
| class Solution { private: int row[9][10]; int col[9][10]; int box[9][10]; int res; public: void solveSudoku(vector<vector<char>>& board) { memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); memset(box,0,sizeof(box)); res=0; int i,j,k; for(i=0;i<9;i++) { for(j=0;j<9;j++) { if(board[i][j]=='.') continue; k=board[i][j]-'0'; row[i][k]++; col[j][k]++; box[i/3*3+j/3][k]++; } } for(i=0;i<9;i++) { for(j=0;j<9;j++) { if(board[i][j]!='.') continue; insert(board,i,j); return ; } } } void insert(vector<vector<char>>& board,int i,int j) { int q; if(j==9) { i++; j=0; } if(i<9&&j<9) { while(board[i][j]!='.') { if(i==8&&j==8) { res++; return ; } if(j==8) { i++; j=0; } else { j++; } } for(q=1;q<=9;q++) { if(row[i][q]!=0||col[j][q]!=0||box[i/3*3+j/3][q]!=0) continue; row[i][q]++; col[j][q]++; box[i/3*3+j/3][q]++; board[i][j]=(char)q+'0';
insert(board,i,j+1); if(res!=0) break; row[i][q]--; col[j][q]--; box[i/3*3+j/3][q]--; board[i][j]='.'; } if(q>9) return ; } res++; return ; } };
|