原来我还真的按照我一般做数独的思路去,先找出能确定填什么数字的,直到不能找到能填的数字后再一个个尝试。
果然计算机完成就是不一样,可以backtracking多少都可以记住。
按照原来想法计算机找到能确定的就很麻烦。
class Solution {
public:
bool validGrid(vector<vector<char> > &board,int i,int j)
{
for(int jj=0;jj<9;jj++)
{
if(jj!=j && board[i][j]==board[i][jj])
return false;
}
for(int ii=0;ii<9;ii++)
{
if(ii!=i && board[ii][j]==board[i][j])
return false;
}
int ii=(i/3)*3;
int jj=(j/3)*3;
for(int iii=ii;iii<ii+3;iii++)
{
for(int jjj=jj;jjj<jj+3;jjj++)
{
if((jjj!=j && iii!=i) && board[i][j]==board[iii][jjj])
return false;
}
}
return true;
}
bool solve(vector<vector<char> > &board)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(board[i][j]=='.')
{
for(int k=1;k<=9;k++)
{
board[i][j]=k+'0';
if(validGrid(board,i,j))
{
if(solve(board)) return true;
}
board[i][j]='.';
}
board[i][j]='.';
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char> > &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
solve(board);
}
};