dfs 数独

 分析:

int row[10][10];//row[i][x]=1表示第i行中数字x已经出现

        int col[10][10];//col[i][x]=1表示第i列中数字x已经出现

        int grid[10][10];//grid[i][x]=1表示第i个小棋盘中数字x已经出现.

        然后假设当前网格坐标为(r,c),那么它对应于第几(k)个小棋盘呢?可以很容易通过分析得出k= (r/3)*3+c/3 .(其中r,c,k都是从0计数的)
 

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=10;
int map[maxn][maxn];
bool row[maxn][maxn];
bool col[maxn][maxn];
bool grid[maxn][maxn];
bool dfs(int r,int c)
{
    if(r==9) return true;//构造完毕
    bool flag=false;
    if(map[r][c])
    {
        if(c==8) flag=dfs(r+1,0);
        else flag=dfs(r,c+1);
        return flag;
    }
    int k=(r/3)*3+c/3;
    for(int i=1;i<=9;i++)if(!row[r][i]&&!col[c][i]&&!grid[k][i])
    {
        row[r][i]=col[c][i]=grid[k][i]=true;
        map[r][c]=i;
        if(c==8) flag=dfs(r+1,0);
        else flag=dfs(r,c+1);
        if(flag) return true;
        map[r][c]=0;
        row[r][i]=col[c][i]=grid[k][i]=false;
    }
    return false;
}
int main()
{
    int T; scanf("%d",&T);
    while(T--)
    {
        memset(row,0,sizeof(row));
        memset(col,0,sizeof(col));
        memset(grid,0,sizeof(grid));
        for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
        {
            char x;
            scanf(" %c",&x);
            map[i][j]= x-'0';
            if(map[i][j])
            {
                row[i][map[i][j]]=true;
                col[j][map[i][j]]=true;
                int k=(i/3)*3+j/3;
                grid[k][map[i][j]]=true;
            }
        }
        dfs(0,0);
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
                printf("%d",map[i][j]);
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40859951/article/details/84573599