LeetCode-37. 解數獨
阿新 • • 發佈:2018-12-25
題目地址:https://leetcode-cn.com/problems/sudoku-solver/
思路:預處理每行每列每塊能取得數,dfs。
AC程式碼:
class Solution { public: bool flag_1[10][10]; bool flag_2[10][10]; bool flag_3[10][10]; bool solve(vector<vector<char>>& board,int x,int y){ for(int i=x;i<9;i++){ for(int j=y;j<9;j++){ int now = i/3 * 3 + j/3; //cout<<now<<endl; if(board[i][j] == '.'){ //cout<<i<<" "<<j<<endl; for(int k = 1;k <= 9;k++){ if(!flag_1[i][k] && !flag_2[j][k] && !flag_3[now][k] ){ board[i][j] = k+'0'; flag_1[i][k] = flag_2[j][k] = flag_3[now][k] = true; if(solve(board,i,j)) return true; flag_1[i][k] = flag_2[j][k] = flag_3[now][k] = false; board[i][j] = '.'; } } return false; } } y = 0; } for(int i=0;i<9;i++){ for(int j=1;j<=9;j++){ if(!flag_1[i][j] || !flag_2[i][j] || !flag_3[i][j] ) return false; } } return true; } void solveSudoku(vector<vector<char>>& board) { memset(flag_1,false,sizeof(flag_1)); memset(flag_2,false,sizeof(flag_2)); memset(flag_3,false,sizeof(flag_3)); for(int i=0;i<9;i++) for(int j=0;j<9;j++){ if(board[i][j] == '.') continue; flag_1[i][board[i][j]-'0'] = true; } for(int i=0;i<9;i++) for(int j=0;j<9;j++){ if(board[j][i] == '.') continue; flag_2[i][board[j][i]-'0'] = true; } int xx[10] = {0,0,0,1,1,1,2,2,2}; int yy[10] = {0,1,2,0,1,2,0,1,2}; for(int i=0;i<=6;i+=3) for(int j=0;j<=6;j+=3){ int now = (i*3+j)/3; for(int k = 0;k<9;k++){ if(board[i+xx[k]][j+yy[k]] == '.') continue; flag_3[now][board[i+xx[k]][j+yy[k]]-'0'] = true; } } solve(board,0,0); } };