NYOJ 722 数独(DFS)

Posted bendandedaima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NYOJ 722 数独(DFS)相关的知识,希望对你有一定的参考价值。

题目链接:722-数独


内存限制:64MB 时间限制:1000ms 特判: No
通过数:2 提交数:87 难度:4

题目描述:

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

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

技术分享图片

输入描述:

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

输出描述:

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

样例输入:

1
0 0 5 3 0 0 0 0 0
8 0 0 0 0 0 0 2 0
0 7 0 0 1 0 5 0 0
4 0 0 0 0 5 3 0 0
0 1 0 0 7 0 0 0 6
0 0 3 2 0 0 0 8 0
0 6 0 5 0 0 0 0 9
0 0 4 0 0 0 0 3 0
0 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 
题意:完成数独.....满足每一行、每一列、每一个3*3宫内的数字均含1-9,不重复。
思路:标记行的1-9个数,列的1-9的数,框框(就是题目中的宫)的1-9个数,然后暴力DFS
 1 #include<stdio.h>
 2 #include<string.h>
 3 int map[10][10];
 4 int hang[10][10];
 5 int lie[10][10];
 6 int kuang[10][10];
 7 int status;//标记是否已经遍历完 
 8 void DFS(int x,int y)
 9 {
10     if(x==9)//因为行是0-8,所以为9的话表示整个数独已经遍历完
11     {
12         status=1;
13         return;
14     }
15     int nx=x,ny=y+1;
16     if(ny==9)//表明这行已经弄完,跳下一行 
17     {
18         ny=0;
19         nx++;
20     }
21     if(map[x][y]==0)
22     {
23         for(int i=1;i<=9;i++)
24         {
25             if(hang[x][i]==0&&lie[i][y]==0&&kuang[x/3*3+y/3+1][i]==0)
26             {
27                 map[x][y]=i;
28                 hang[x][i]=1;
29                 lie[i][y]=1;
30                 kuang[x/3*3+y/3+1][i]=1;
31                 DFS(nx,ny);
32                 if(status==1) return;
33                 map[x][y]=0;//回溯 
34                 hang[x][i]=0;//回溯 
35                 lie[i][y]=0;//回溯 
36                 kuang[x/3*3+y/3+1][i]=0;//回溯 
37             }
38         }
39     }
40     else DFS(nx,ny);
41 }
42 int main()
43 {
44     int T;
45     scanf("%d",&T);
46     while(T--)
47     {    
48         status=0;
49         memset(hang,0,sizeof(hang));
50         memset(lie,0,sizeof(lie));
51         memset(kuang,0,sizeof(kuang));
52         for(int i=0;i<9;i++)
53         for(int j=0;j<9;j++)
54         {
55             scanf("%d",&map[i][j]);
56             if(map[i][j]!=0)
57             {
58                 hang[i][map[i][j]]=1;
59                 lie[map[i][j]][j]=1;
60                 kuang[i/3*3+j/3+1][map[i][j]]=1;
61             }
62         }
63         DFS(0,0);
64         for(int i=0;i<9;i++)
65         for(int j=0;j<9;j++)
66         {
67             if(j==8)
68             printf("%d
",map[i][j]);
69             else
70             printf("%d ",map[i][j]);
71         }
72     }
73     return 0;
74 }

 

 

以上是关于NYOJ 722 数独(DFS)的主要内容,如果未能解决你的问题,请参考以下文章

nyoj 数独

[dfs] aw166. 数独(dfs剪枝与优化+状态压缩+代码技巧+好题)

数独 dfs

数独 (dfs)

洛谷 P1784 数独[DFS/回溯]

数独(dfs解)