• 练习题——数独


    题目描述

    给出一个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);
        }
    }


  • 相关阅读:
    Javascript的IE和Firefox兼容性汇编(转)
    JSP里request变量列表
    C#中的接口(转)
    寒羽对帝国的理解(通向高手之路)(转)
    怎样获得Sqlserver 2000得实例列表和运行在一个实例上得数据库列表(转)
    jsp文件上传的处理(转)
    用户不上你的网站的50个原因
    慈勤强的JFolder1.0版代码(JSP)
    管理常用SQL语句
    .net 取得访问的url
  • 原文地址:https://www.cnblogs.com/Darknesses/p/12002558.html
Copyright © 2020-2023  润新知