数独解法

<pre name="code" class="cpp">
<pre name="code" class="cpp">//25...9.4.
//4.71.3..6
//8.34.759.
//3.8.7..69
//.1.3.24..
//5.49.6.83
//9.6.3.7.8
//.3.6.8.1.
//1.2.9.6.4

 
struct node
{
    node(int r,int c):row(r),col(c) {}
    friend ostream& operator <<(ostream& os,node& a)
    {
        cout<<a.row<<" "<<a.col<<endl;
        return os;
    }
    int row,col;
};

class Solution
{
    vector<node>holes;
    bool rowFlg[9][10];
    bool colFlg[9][10];
    bool rectFlg[3][3][10];
public:
    bool isValidSudoku(vector<vector<char> > &board)
    {
        memset(rowFlg,0,sizeof(rowFlg));
        memset(colFlg,0,sizeof(colFlg));
        memset(rectFlg,0,sizeof(rectFlg));
        holes.clear();
        for(int i=0; i<board.size(); i++)
        {
            for(int j=0; j<board[i].size(); j++)
            {
                if(board[i][j]=='.')holes.push_back(node(i,j));
                else
                {
                    rowFlg[i][board[i][j]-'0']=true;
                    colFlg[j][board[i][j]-'0']=true;
                    rectFlg[i/3][j/3][board[i][j]-'0']=true;
                }
            }
        }
        return display(board,holes.size()-1);
    }
    bool  display(vector<vector<char> > &board,int holeIndex)
    {
        if(holeIndex==-1)return true;
        for(int value=1; value<=9; value++)
        {
            if(checkCanDisplay(holes[holeIndex],value))
            {
                //放置
                node pos=holes[holeIndex];
                board[pos.row][pos.col]=value+'0';
                rowFlg[pos.row][value]=true;
                colFlg[pos.col][value]=true;
                rectFlg[pos.row/3][pos.col/3][value]=true;

                if(display(board,holeIndex-1))return true;

                rowFlg[pos.row][value]=false;
                colFlg[pos.col][value]=false;
                rectFlg[pos.row/3][pos.col/3][value]=false;
            }
        }
        return false;
    }
    bool checkCanDisplay(node pos,int value)
    {
       if(colFlg[pos.col][value]||rowFlg[pos.row][value]||rectFlg[pos.row/3][pos.col/3][value])
        return false;
        return true;
    }
};



                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值