Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character'.'.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
题目的输入保证是有效的。这样用回溯法我们只要检查新加入的值能否在行、列以及小方块里有效即可,没有必要检查整个矩阵。
class Solution {
public:
//判断某个方格内的值是否能组成数独
bool IsvalidSudoku(vector<vector<char> > &board,int x,int y)
{
int i,j;
//判断方格(x,y)所在行能否组成数独
for(j=0;j<9;j++)
{
if(j!=y&&board[x][j]==board[x][y])
return false;
}
//判断方格(x,y)所在列能否组成数独
for(i=0;i<9;i++)
{
if(i!=x&&board[i][y]==board[x][y])
return false;
}
//判断方格(x,y)所在九宫格能否组成数独
for(i=(x/3)*3;i<(x/3+1)*3;i++)
{
for(j=(y/3)*3;j<(y/3+1)*3;j++)
{
if(i!=x&&j!=y&&board[i][j]==board[x][y])
return false;
}
}
return true;
}
//将某个空方格赋值
bool SolveSudoku(vector<vector<char> > &board)
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(board[i][j]=='.')
{
for(int k=1;k<=9;k++)
{
board[i][j]='0'+k;//将空格赋值,注意,将整数变为字符;将字符变为整数.
if(IsvalidSudoku(board,i,j)&&SolveSudoku(board))
return true;//回溯算法,继续遍历其他空方格
board[i][j]='.';
}
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char> > &board)
{
SolveSudoku(board);
}
};