首页 > 其他 > 详细

Sudoku Solver leetcode

时间:2014-03-13 22:38:46      阅读:465      评论:0      收藏:0      [点我收藏+]

用位运算优化了一下,需要填入的点也事先扫描出来,每个格子属于哪个九宫格也事先算出。

bubuko.com,布布扣
class Solution {
    struct point
    {
        int x,y;
        point(int X=0,int Y=0):x(X),y(Y){}
    }next_point[9][9];
    vector<vector<char>> *pData;
    static const int mask=0x000001FF;
    char log2ADD1[513];
    int hash[9][9];
    int row_forbid[9],col_forbid[9],cur_forbid[9];
    bool dfs(int toFill,int x,int y)
    {
        int nextx=next_point[x][y].x,nexty=next_point[x][y].y;
        int cur=hash[x][y];
        int not_forbid=mask&~(row_forbid[x]|col_forbid[y]|cur_forbid[cur]);
        while (not_forbid>0)
        {
            int p=not_forbid&(-not_forbid);
            not_forbid^=p;
            (*pData)[x][y]=log2ADD1[p];
            row_forbid[x]|=p;
            col_forbid[y]|=p;
            cur_forbid[cur]|=p;
            if (toFill==1 || dfs(toFill-1,nextx,nexty))    
                return true;
            row_forbid[x]^=p;
            col_forbid[y]^=p;
            cur_forbid[cur]^=p;
        }
        return false;
    }
public:
    void solveSudoku(vector<vector<char> > &board) {
        int i,j,toFill=0;
        for (i=j=1;i<=9;++i)
        {
            log2ADD1[j]=i+0;
            j<<=1;
        }
        for (i=0;i<9;++i)
            for (j=0;j<9;++j)
                hash[i][j]=i/3*3+j/3;
        pData=&board;
        memset(row_forbid,0,sizeof(row_forbid));
        memset(col_forbid,0,sizeof(col_forbid));
        memset(cur_forbid,0,sizeof(cur_forbid));
        point pre;
        for (i=0;i<9;++i)
        {
            for (j=0;j<9;++j)
            {
                if (board[i][j]!=.)
                {
                    int forbid=1<<(board[i][j]-1);
                    row_forbid[i]|=forbid;
                    col_forbid[j]|=forbid;
                    cur_forbid[hash[i][j]]|=forbid;
                }
                else
                {
                    ++toFill;
                    if (toFill>1)
                    {
                        next_point[pre.x][pre.y].x=i;
                        next_point[pre.x][pre.y].y=j;
                    }
                    pre.x=i;
                    pre.y=j;
                }
            }
        }
        for (i=0;i<9;++i)
            for (j=0;j<9;++j)
                if (board[i][j]==.)
                {
                    dfs(toFill,i,j);
                    return;
                }
    }
};
View Code

Sudoku Solver leetcode,布布扣,bubuko.com

Sudoku Solver leetcode

原文:http://www.cnblogs.com/deller/p/3599241.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!