【poj 2627】 Sudoku 题意&题解&代码(C++)

题目链接:
http://poj.org/problem?id=2676
题意:
给出一个未填的数独,求这个数独的解并输出填好的数独,若此数独无解,则输出原给定的错误数独。
题解:
dfs回溯搜索
代码:

#include
#include
#include
#include
using namespace std;
int flag,T,f[15][15],c[15][15];
char shu[15];
int vis[4][4][10],visx[15][10],visy[15][10];
void init()
{
    memset(vis,0,sizeof(vis));
    memset(visx,0,sizeof(visx));
    memset(visy,0,sizeof(visy));
}
void dfs()
{
    if (flag==1) return ;
    int x=-1,y=-1;
    for (int i=1;i<=9;i++)
    for (int j=1;j<=9;j++)
    if (c[i][j]==0)
    {
        x=i,y=j;
        break;
    }
//  cout<
    if (x==-1&&y==-1) 
    {
        for (int i=1;i<=9;i++)
                {
                        for (int j=1;j<=9;j++)
                        printf("%d",c[i][j]);
                        printf("\n");
                }

        flag=1;
        return ;
    }
    for (int i=1;i<=9;i++)
    if (visx[x][i]==0&&visy[y][i]==0&&vis[(x-1)/3][(y-1)/3][i]==0)
    {
        visx[x][i]=1;visy[y][i]=1;vis[(x-1)/3][(y-1)/3][i]=1;
        c[x][y]=i;
        dfs();
        c[x][y]=0;
                visx[x][i]=0;visy[y][i]=0;vis[(x-1)/3][(y-1)/3][i]=0;       
    }
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        init();
        for (int i=1;i<=9;i++)
        {
            scanf("%s",shu);
            for (int j=1;j<=9;j++)
            {
                int tmp=shu[j-1]-'0';
                f[i][j]=tmp;c[i][j]=tmp;
                visx[i][tmp]=1;
                visy[j][tmp]=1;
                vis[(i-1)/3][(j-1)/3][tmp]=1;
            }
        }
        flag=0;
        dfs();
        if (flag==0)
            for (int i=1;i<=9;i++)
        {
                        for (int j=1;j<=9;j++)
                        printf("%d",f[i][j]);
                        printf("\n");
            }
    }
}

你可能感兴趣的:(oi之路,poj)