POJ 2676 Sudoku

这题是个DFS搜索题。

大致题意:

九宫格问题,也有人叫数独问题

把一个9行9列的网格,再细分为9个3*3的子网格,要求每行、每列、每个子网格内都只能使用一次1~9中的一个数字,即每行、每列、每个子网格内都不允许出现相同的数字。


下面是代码:

#include <stdio.h>
#include <string.h>
bool vish[9][10],visl[9][10],visg[9][10];\\行标记数组,列标记数组,方块标记数组
int map1[9][9],flat;
void DFS (int x,int y)
{
    int x1,y1,i;
    if(flat==1)
    {
        return;
    }
    if(map1[x][y]==0)
    {
        for(i=1; i<10; i++)
        {
            if(!vish[x][i]&&!visl[y][i]&&!visg[x/3*3+y/3][i])
            {
                map1[x][y]=i;
                y1=y+1;
                x1=x;
                if(y1==9)
                {
                    y1=0;
                    x1++;
                }
                if(x1==9)
                {
                    flat=1;
                    return ;
                }
                vish[x][i]=1;
                visl[y][i]=1;
                visg[x/3*3+y/3][i]=1;
                DFS(x1,y1);
                if(flat)
                {
                    return;
                }
                vish[x][i]=0;
                visl[y][i]=0;
                visg[x/3*3+y/3][i]=0;
                map1[x][y]=0;
            }
        }
    }
    else
    {
        y1=y+1;
        x1=x;
        if(y1==9)
        {
            y1=0;
            x1++;
        }
        if(x1==9)
        {
            flat=1;
            return ;
        }
         DFS(x1,y1);
    }
    return ;
}
int main()
{
    int t,i,j,m;
    scanf("%d",&t);
    char s[12];
    while(t--)
    {
        memset(vish,0,sizeof(vish));
        memset(visl,0,sizeof(visl));
        memset(visg,0,sizeof(visg));
        for(i=0; i<9; i++)
        {
            scanf("%s",s);
            for(j=0; j<9; j++)
            {
                m=s[j]-'0';
                if(m)
                {
                    vish[i][m]=1;
                    visl[j][m]=1;
                    visg[i/3*3+j/3][m]=1;
                    map1[i][j]=m;
                }
                else
                {
                    map1[i][j]=0;
                }
            }
        }
        flat=0;
        DFS(0,0);
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                printf("%d",map1[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}


posted @ 2013-08-21 21:00  、小呆  阅读(108)  评论(0编辑  收藏  举报