您的位置:首页 > 其它

[Leetcode] Sudoku Solver

2013-03-02 02:57 309 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: