求解数独
这道题其实不难,回溯就行,唯一难点就是怎么判断每一个小九宫格内数字的唯一性。
有一个非常巧妙的方法:
每一个小九宫格的编号:
(i / 3) * 3 + j / 3
i,j分别是行和列,/代表整除。
代码:
class Solution { public: int row[10][10]; int col[10][10]; int box[9][10]; bool ans; void backTrack(int i, int j,vector<vector<char>>& board){ int index = (i /3)*3+j/3; if(board[i][j] == '.'){ for(int k = 1; k < 10; k++){ if(ans) return; if(row[i][k] == 0 && col[j][k] == 0 && box[index][k] == 0){ board[i][j] = k + '0'; row[i][k] = 1; col[j][k] = 1; box[index][k] = 1; if(i == 8 && j == 8){ans = true;return;} else if(j == 8 && i < 8){backTrack(i + 1, 0, board);} else backTrack(i, j + 1, board); if(!ans){ board[i][j] = '.'; row[i][k] = 0; col[j][k] = 0; box[index][k] = 0; } } } } else{ if(i == 8 && j == 8){ans = true;return;} else if(j == 8 && i < 8){backTrack(i + 1, 0, board);} else backTrack(i, j + 1, board); } } void solveSudoku(vector<vector<char>>& board) { for(int i = 0; i < 9; i++) for(int j = 0; j < 10; j++){ row[i][j] = 0; col[i][j] = 0; box[i][j] = 0; } for(int i = 0; i < 9; i++) for(int j = 0; j<9; j++) if(board[i][j] != '.'){//init int d = board[i][j] - '0'; row[i][d] = 1; col[j][d] = 1; box[i / 3 * 3 + j / 3][d] = 1; } ans = false; backTrack(0,0,board); } };