poj 2676 Sudoku

题意:完成9*9的数独。

思路:直接DFS即可,判断该数是否在该行、该列、该九格中出现过。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <string>
#include <math.h>
#include <map>
using namespace std;
int d[10][10];//存储整个矩阵
int p[100][2];//存储需要填的点
int k;//需要填的点的个数
bool x[10][10],y[10][10],z[10][10];//标记数组
bool dfs(int v)
{
    if(v==k) return true;
    for(int i=1;i<10;i++)
    {
        if(!x[p[v][0]][i] && !y[p[v][1]][i] && !z[p[v][0]/3*3+p[v][1]/3][i])
        {
            d[p[v][0]][p[v][1]]=i;
            x[p[v][0]][i] = true;
            y[p[v][1]][i] = true;
            z[p[v][0]/3*3+p[v][1]/3][i]=true;
            if(dfs(v+1)) return true;
            d[p[v][0]][p[v][1]]=0;
            x[p[v][0]][i] = false;
            y[p[v][1]][i] = false;
            z[p[v][0]/3*3+p[v][1]/3][i]=false;
        }
    }
    return false;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        char s[10];
        memset(d,0,sizeof(d));
        memset(p,0,sizeof(p));
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(z,0,sizeof(z));
        k=0;
        for(int i=0;i<9;i++)
        {
            scanf(" %s",s);
            for(int j=0;j<9;j++)
            {
                d[i][j]=s[j]-'0';
                if(d[i][j]==0)
                {
                    p[k][0]=i;
                    p[k++][1]=j;
                }
                else
                {
                    x[i][d[i][j]]=true;
                    y[j][d[i][j]]=true;
                    z[i/3*3+j/3][d[i][j]]=true;
                }
            }
        }
        dfs(0);
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                printf("%d",d[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

 

posted on 2017-10-26 16:19  13rj1115  阅读(170)  评论(0编辑  收藏  举报

导航