Sudoku 数独(深搜)

题目

Sudoku对数独非常感兴趣,今天他在书上看到了几道数独题: 
给定一个由3*3的方块分割而成的9*9的表格(如图),其中一些表格填有1-9的数字,其余的则为空白(数字0为空白)。请在空白表格中填入数字1-9使得9*9表格的每行、每列、每个3*3块内无重复数字。 

Input

第一行输入一个整数T,表示样例数量。对于每个样例, 一共9行, 表示数独表格的每一行。接下来每一行输入一个字符串表示数独表格的每一行的9个数字。数独表格中空白用数字0表示。

Output

对于每组样例,输出完整的数独表格,即数独表格的每一个空白都按规定填满数字。如果答案不唯一,输出任何一个答案就行。

Sample Input

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

Sample Output

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127

行列判断数 每个小9宫格判断数 有个点注意要return 代码中标注了 

#include<stdio.h>
#include<string.h>
using namespace std;
int hang[9][10]= {0};
int lie[9][10]= {0};
int meige[9][10];
int map[9][9];
int ji[9][9];
char ling[9][9];
int flag=0;
void re(int x,int y)
{
    if(x==8&&y==8)
    {
        flag=1;
        for(int i=0; i<9; i++)
        {
            for(int j=0; j<9; j++)
            {
                printf("%d",map[i][j]);
            }
            printf("\n");
        }
    }
    if(flag==1)
        return ;
    for(int i=0; i<9; i++)
    {
        for(int j=0; j<9; j++)
        {
            if(i==8&&j==8&&map[i][j])
            {
                flag=1;
                for(int i=0; i<9; i++)
                {
                    for(int j=0; j<9; j++)
                    {
                        printf("%d",map[i][j]);
                    }
                    printf("\n");
                }
            }
            if(ji[i][j]==0)
            {
//                printf("%d %d\n",i,j);
                for(int z=1; z<=9; z++)
                {
                    int k=3*(i/3)+j/3;
                    if(hang[i][z]==0&&lie[j][z]==0&&meige[k][z]==0)
                    {

                        map[i][j]=z;
                        ji[i][j]=1;
                        hang[i][z]=1;
                        lie[j][z]=1;
                        meige[k][z]=1;
//                        printf("%d\n",map[i][j]);
                        re(i,j);

                        map[i][j]=0;
                        ji[i][j]=0;
                        hang[i][z]=0;
                        lie[j][z]=0;
                        meige[k][z]=0;
                        if(flag)
                            return ;
                    }
                }
                return ;//这里不加就到下一个位置了
            }
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        flag=0;
        memset(ling,0,sizeof(ling));
        memset(map,0,sizeof(map));
        memset(ji,0,sizeof(ji));
        memset(meige,0,sizeof(meige));
        memset(hang,0,sizeof(hang));
        memset(lie,0,sizeof(lie));
        for(int i=0; i<9; i++)
        {
            scanf("%s",ling[i]);
        }
        for(int i=0; i<9; i++)
        {
            for(int j=0; j<9; j++)
            {
                map[i][j]=ling[i][j]-'0';
                if(map[i][j]!=0)
                {
                    hang[i][map[i][j]]=1;
                    lie[j][map[i][j]]=1;
                    ji[i][j]=1;
                    int k=3*(i/3)+(j/3);
                    meige[k][map[i][j]]=1;
                }

            }
        }
        re(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_43372531/article/details/85107422