您的位置:首页 > 其它

37. Sudoku Solver

2016-04-26 10:17 281 查看
//回溯法解
//注意递归终止条件,一个是递归到点(8,8)而且该点为数字,另一个是递归到该点,该点处为‘.’,而且可以放置数字。
//cout<<bitset<sizeof(int)*8>(r[i][j])<<"  "; 二进制输出
class Solution {
public:
void find_result(int  r[3][9],vector<vector<char>>& b,int x,int y,bool & flag) {
if(x==9) return;
for(int i=x;i<9;i++)
{
for(int j=(i==x?y:0);j<9;j++)
{
if(b[i][j]=='.')
{
for(int k=0;k<9;k++)
{
if(r[0][i]&(1<<k)||r[1][j]&(1<<k)||r[2][i/3*3+j/3]&(1<<k)) continue;
if(i==8&&j==8) flag=true;
b[i][j]='1'+k;

r[0][i]|=(1<<k);
r[1][j]|=(1<<k);
r[2][i/3*3+j/3]|=(1<<k);
find_result(r,b,i,j+1,flag);
if(flag) return;
r[0][i]&=~(1<<k);
r[1][j]&=~(1<<k);
r[2][i/3*3+j/3]&=~(1<<k);
}
b[i][j]='.';
return;
}
else if(i==8&&j==8) flag=true;
if(flag) return;
}
}
}
void solveSudoku(vector<vector<char>>& b) {
int r[3][9]={0};
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(b[i][j]!='.')
{
int k=b[i][j]-'1';
r[0][i]|=(1<<k);
r[1][j]|=(1<<k);
r[2][i/3*3+j/3]|=(1<<k);
}
}
}
bool falg=false;
find_result(r,b,0,0,falg);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: