数独 搜索

来源:互联网 发布:数据库管理证书 编辑:程序博客网 时间:2024/05/16 11:49

数独

时间限制: 1 Sec  内存限制: 64 MB
提交: 12  解决: 12
[提交][状态][讨论版]

题目描述

  数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

  有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它。。


输入

第一行有一个数n(0< n <100),表示有n组测试数据,每组测试数据是由一个9*9的九宫格构成,0表示对应的格子为空

输出

输出一个9*9的九宫格,为这个数独的答案

样例输入

10 0 5 3 0 0 0 0 08 0 0 0 0 0 0 2 00 7 0 0 1 0 5 0 04 0 0 0 0 5 3 0 00 1 0 0 7 0 0 0 60 0 3 2 0 0 0 8 00 6 0 5 0 0 0 0 90 0 4 0 0 0 0 3 00 0 0 0 0 9 7 0 0

样例输出

1 4 5 3 2 7 6 9 8 8 3 9 6 5 4 1 2 7 6 7 2 9 1 8 5 4 3 4 9 6 1 8 5 3 7 2 2 1 8 4 7 3 9 5 6 7 5 3 2 9 6 4 8 1 3 6 7 5 4 2 8 1 9 9 8 4 7 6 1 2 3 5 5 2 1 8 3 9 7 6 4 
# include<stdio.h># include<string.h>int v1[10][10],v2[10][10],v3[4][4][10];int a[9][9];void dfs(int n){    int x=n/9;//行数 (从0开始)     int y=n%9;//列数     if(n==81) // 成功     {        for(int i=0;i<9;i++)         {            for(int j=0;j<9;j++)            printf("%d ",a[i][j]);            printf("\n");        }             return ;        }    if(!a[x][y])//如果没数字     {        for(int i=1;i<=9;i++)        {            if(v1[x][i]||v2[y][i]||v3[x/3][y/3][i])//如果有相同数的字             continue;            v1[x][i]=v2[y][i]=v3[x/3][y/3][i]=1;//标记             a[x][y]=i;//赋值             dfs(n+1);            v1[x][i]=v2[y][i]=v3[x/3][y/3][i]=0;//如果不成功,去除标记             a[x][y]=0;//并且将原来的值 去掉         }       }    else dfs(n+1);     }int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(v1,0,sizeof(v1));        memset(v2,0,sizeof(v2));        memset(v3,0,sizeof(v3));    int i,j;            for(i=0;i<9;i++)        for(j=0;j<9;j++)        {            scanf("%d",&a[i][j]);            int k=a[i][j];            v1[i][k]=1;//标记行的数字             v2[j][k]=1;//标记列的数字             v3[i/3][j/3][k]=1; //标记每一个3*3宫内的数字                 }        dfs(0);    }      return 0;}


原创粉丝点击