37. Sudoku Solver

来源:互联网 发布:java个人简历自我评价 编辑:程序博客网 时间:2024/04/29 20:39
//回溯法解//注意递归终止条件,一个是递归到点(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);    }};
0 0
原创粉丝点击