练习题——数独

题目描述

给出一个9*9的表格,部分格子已经填好数。请填完所有空白格子,使得表格每一行、每一列、每个3*3的九宫格,都恰好填满1-9这9个数字。

输入

第1行:1个整数,表示测试数据的个数,接下来依次是每个测试数据

每个数据共9行,每行恰好9个数字字符串。每个数字在0-9之间,若为1-9则表示某个格子已经填好的数字,若为0,则表示未填数

输出

每个测试数据输出9行,表示填好的数独表格

样例输入

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

样例输出

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127


首先认定使用深搜(广搜完全是找死),每一个格子都试一下每一个数,如果这个格子初始就有数,使用一个 if 语句跳过


代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int v[11][11],h[11][11],l[11][11],a[11][4][4];
bool q;
void start()
{
    memset(v,0,sizeof(v));
    memset(h,0,sizeof(h));
    memset(l,0,sizeof(l));
    memset(a,0,sizeof(a));
	q=0;
}
void scan()
{
    char c[11];
    for(int i=1;i<=9;i++)
    {
        scanf("%s",c+1);
        for(int j=1;j<=9;j++)
            if(c[j])
            {
                v[i][j]=c[j]-48;
                h[c[j]-48][i]=1;
                l[c[j]-48][j]=1;
                a[c[j]-48][(i+2)/3][(j+2)/3]=1;
            }
    }
}
void print()
{
    int i,j;
    for(i=1;i<=9;i++)
    {
        for(j=1;j<=9;j++)
            printf("%d",v[i][j]);
        printf("
");
    }
    q=1;
}
void work(int x,int y)
{
    int i;
    if(!q)
    {
        if(x==10){print();return;}
        if(y==10){work(x+1,1);return;}
        if(v[x][y]){work(x,y+1);return;}
        for(i=1;i<=9;i++)
        {
            if(!h[i][x]&&!l[i][y]&&!a[i][(x+2)/3][(y+2)/3])
            {
                h[i][x]=1,v[x][y]=i,l[i][y]=1,a[i][(x+2)/3][(y+2)/3]=1;
                work(x,y+1);
                h[i][x]=0,v[x][y]=0,l[i][y]=0,a[i][(x+2)/3][(y+2)/3]=0;
            }
        }
    }
}
int main()
{
    int nn;
    scanf("%d",&nn);
    for(;nn;nn--)
    {
        start();
        scan();
        work(1,1);
    }
}


原文地址:https://www.cnblogs.com/Darknesses/p/12002558.html