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.
回溯!
我的代码有一个弊病,每次回溯都从 board[0][0] 开始搜,浪费时间。解决方案是设计一个position struct (包含x,y坐标),将所有的 empty position 放入一个 vector,再一个一个处理。(类似 DFS 的说)但是,我还是太懒了,唔~
class Solution {
public:
void solveSudoku(vector<vector<char> > &board)
{
solveThisSudoku(board);
}
bool solveThisSudoku(vector<vector<char> > &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
bool forward = false;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(board[i][j]=='.')
{
for(int val=1;val<=9;val++)
{
board[i][j] = '0' + val;
if( checkSudoku(board,i,j) && solveThisSudoku(board)== true )
{
return true;
}
board[i][j] = '.';
}
return false;
}
}
}
return true;
}
bool checkSudoku(vector<vector<char> >& board, int x, int y)
{
bool flags[9] = {0};
for(int i = 0; i < 9; ++i)
if(board[x][i] >= '1' && board[x][i] <= '9')
{
if(!flags[board[x][i] - '1'])
flags[board[x][i] - '1'] = true;
else
return false;
}
memset(flags, 0, 9);
for(int i = 0; i < 9; ++i)
if(board[i][y] >= '1' && board[i][y] <= '9')
{
if(!flags[board[i][y] - '1'])
flags[board[i][y] - '1'] = true;
else
return false;
}
int xx = x/3*3;
int yy = y/3*3;
memset(flags, 0, 9);
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 3; ++j)
if(board[xx+i][yy+j] >= '1' && board[xx+i][yy+j] <= '9')
{
if(!flags[board[xx+i][yy+j]-'1'])
flags[board[xx+i][yy+j]-'1'] = true;
else
return false;
}
return true;
}
};