传送门:https://leetcode.com/problems/sudoku-solver/
问题分析:是leetcode_36的进一步表示。
思路是用深度优先来求解:如果这一点不是空白,则进行下一组操作。
如果这一点是空白,则进行九次循环,如果某一次循环满足check的条件并且能够满足solve(cur+1),即之后的所有情况,直到cur==81为止,则return true;
换言之,除了cur==81这一个条件外,其他都应该返回false.(跳出for循环已经很能说明问题了)
注意如果此次循环不成功,则在之后还要把board[i][j]的值变为'.'。
AC代码:
class Solution {
public:
bool check(int x,int y,vector<vector<char> >& board)
{
for(int i=0;i<9;i++)
if(i!=x && board[i][y]==board[x][y]) return false;//检验横行
for(int i=0;i<9;i++)
if(i!=y && board[x][i]==board[x][y]) return false;
//check for the line
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(board[x/3*3+i][y/3*3+j]==board[x][y] && x!=x/3*3+i && y!=y/3*3+j)
return false;
return true;
}
bool solve(int cur,vector<vector<char> >&board)
{
//cur 0->80;
if(cur==81) return true;
int i=cur/9;
int j=cur%9;
if(board[i][j]!='.') return solve(cur+1,board);
for(int k=1;k<=9;k++)
{
board[i][j]=k+'0';
if(check(i,j,board) && solve(cur+1,board))
return true;
board[i][j]='.';
}
return false;
}
void solveSudoku(vector<vector<char> > &board) {
//已经给定好了参数
solve(0,board);
}
};