Sudoku POJ - 2676(深度优先搜索)(81宫格填数)

传送门

题意:在81宫格中填入1-9,使得每一行,每一列,每一大块(9个一块)都不相同

题解:使用深度优先搜索,可以使用row[9][10],col[9][10],block[9][10]来标记

还有个判断在第几块的套路,可以先在纸上比划,最后就得出规律了

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

struct pos{
    int r,c;
    pos(){}
    pos(int r,int c):r(r),c(c){}
};
vector<pos>blank;

int board[9][9],row[9][10],col[9][10],block[9][10];

int getblocknum(int r,int c)
{
    int x=r/3;
    int y=c/3;
    return x*3+y;
}

void setflag(int r,int c,int num,int value)
{
    row[r][num]=value;
    col[c][num]=value;
    block[getblocknum(r,c)][num]=value;
}

bool isok(int r,int c,int num)
{
    return row[r][num]==0&&col[c][num]==0&&block[getblocknum(r,c)][num]==0;
}

bool dfs(int n)
{
    if(n<0){
        return true;
    }
    int x=blank[n].r;
    int y=blank[n].c;
    for(int i=1;i<=9;i++){
        if(isok(x,y,i)){
            board[x][y]=i;
            setflag(x,y,i,1);
            if(dfs(n-1)){
                return true;
            }
            setflag(x,y,i,0);
        }
    }
    return false;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        memset(row,0,sizeof(row));
        memset(col,0,sizeof(col));
        memset(block,0,sizeof(block));
        blank.clear();
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                char c;
                cin>>c;
                board[i][j]=c-'0';
                if(board[i][j]){
                    setflag(i,j,board[i][j],1);
                }else{
                    blank.push_back(pos(i,j));
                }
            }
        }
        if(dfs(blank.size()-1)){
            for(int i=0;i<9;i++){
                for(int j=0;j<9;j++){
                    printf("%d",board[i][j]);
                }
                printf("\n");
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/80792955