HDU 1426(数独 DFS)

题意是完成数独。

记录全图,将待填位置处填 0,记录下所有的待填位置,初始化结束。在每个待填位置处尝试填入 1 - 9,若经过判断后该位置可以填入某数字,则继续向下填下一个位置,

回溯时把待填位置重新赋值为 0,总之就是深搜的思想。

要注意存数时是从 0 位置存到 8 位置,而不是从 1 位置存到 9 位置,因为这样在后面判断是否满足 3*3 的小九宫格要求时可以直接用坐标乘以 3 再除以 3 的方法到达小九

宫格的左上角位置,便于遍历小九宫格。

代码如下:

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 char c;
  4 int cnt,cur,cas,f,mp[10][10];
  5 struct node
  6 {
  7     int x,y;
  8 }q[90];
  9
 10 bool judge(int n,int cur)
 11 {
 12     for(int i = 0; i < 9; ++i)
 13     {
 14         if(mp[q[cur].x][i] == n || mp[i][q[cur].y] == n)
 15             return false;
 16     }
 17     int x = q[cur].x/3*3;
 18     int y = q[cur].y/3*3;
 19     for(int i = 0; i < 3; ++i)
 20         for(int j = 0; j < 3; ++j)
 21         {
 22             if(mp[x+i][y+j] == n)
 23                 return false;
 24         }
 25     return true;
 26 }
 27
 28 void out()
 29 {
 30     for(int i = 0; i < 9; ++i)
 31     {
 32         for(int j = 0; j < 9; ++j)
 33         {
 34             if(j) printf(" ");
 35             printf("%d",mp[i][j]);
 36         }
 37         puts("");
 38     }
 39 }
 40
 41 void dfs(int cur)
 42 {
 43     if(cur == cnt)
 44     {
 45         out();
 46         f = 1;
 47     }
 48     else
 49     {
 50         for(int i = 1; i <= 9&&!f; ++i)
 51         {
 52             if(judge(i,cur))
 53             {
 54                 mp[q[cur].x][q[cur].y] = i;
 55                 dfs(cur+1);
 56                 mp[q[cur].x][q[cur].y] = 0;
 57             }
 58         }
 59     }
 60 }
 61 int main()
 62 {
 63     while(cin >> c)
 64     {
 65         cnt = 0;
 66         if(c==‘?‘)
 67         {
 68             q[cnt].x = 0;
 69             q[cnt++].y = 0;
 70             mp[0][0] = 0;
 71         }
 72         else mp[0][0] = c-‘0‘;
 73         for(int i = 1; i < 9; ++i)
 74         {
 75             cin >> c;
 76             if(c==‘?‘)
 77             {
 78                 q[cnt].x = 0;
 79                 q[cnt++].y = i;
 80                 mp[0][i] = 0;
 81             }
 82             else mp[0][i] = c-‘0‘;
 83         }
 84         for(int i = 1; i < 9; ++i)
 85             for(int j = 0; j < 9; ++j)
 86             {
 87                 cin >> c;
 88                 if(c==‘?‘)
 89                 {
 90                     q[cnt].x = i;
 91                     q[cnt++].y = j;
 92                     mp[i][j] = 0;
 93                 }
 94                 else mp[i][j] = c-‘0‘;
 95             }
 96         f = 0;
 97         if(cas++) puts("");
 98         dfs(0);
 99
100     }
101     return 0;
102 }

对于九宫格问题还可以用舞蹈链的方法,但水平有限,没有掌握...... 有兴趣者请移步:https://www.cnblogs.com/grenet/p/3163550.html

原文地址:https://www.cnblogs.com/Taskr212/p/9610746.html

时间: 2024-10-10 15:57:01

HDU 1426(数独 DFS)的相关文章

Sudoku Killer(hdu 1426 数独)

数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字.同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字.比如有这样一个题,大家可以仔细观察一下,在这里面每行.每列,以及每个3x3的方格都包含1-9这九个数字. 例题: 答案: Input 本题包含多组测试,每组之间由一个空行隔开.每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开.其中1-9代表该位置的已经填好的数,问号(?

HDU 3909 数独

Sudoku Time Limit: 50000/20000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 501    Accepted Submission(s): 208 Problem Description AmazingCaddy likes Sudoku very much. One day, he got some Sudoku problems and he

HDU 4921 Map DFS+状态压缩+乘法计数

算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久,其实因为只能取某个链的前缀,所以直接取链长加+1 然后相乘即可,当然因为会出现都是空的那种情况,要去掉,全部乘完之后,要-1 然后就是算权值了,权值等于当前加进来的点的总和 以及 等级相同的点的加成,并不是特别好算,这时候考虑每个状态下的点对全局的贡献,对,就是这个思想,用状态压缩来表示状态,然后这

HDU 1426 Sudoku Killer(dfs 解数独)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9804    Accepted Submission(s): 2944 Problem Description 自从2006年3月10日至11日的首届数独世界

HDU 1426 Sudoku Killer【DFS 数独】

自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会. 所以全球人民前仆后继,为了奖品日夜训练茶饭不思.当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的

HDU 1426 Sudoku Killer(数独,划分区域是关键)

Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6283    Accepted Submission(s): 1981 Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单

hdu 1426(DFS+坑爹的输入输出)

Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6798    Accepted Submission(s): 2117 Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视.据说,在2008北京奥运会上,会将数独列为一个单独的

HDU 1426 dancing links解决数独问题

题目大意: 这是一个最简单的数独填充题目,题目保证只能产生一种数独,所以这里的初始9宫格较为稠密,可以直接dfs也没有问题 但最近练习dancing links,这类数据结构解决数独无疑效率会高很多 dancing links的数独限制条件是: 1.每行有9个元素,共9行 对应dlx81列 2.每列有9个元素,共9行 对应dlx81列 3.每个九宫格有9个元素,共9行 对应dlx81列 4.81个格子,每个格子最多有一个数 1 #include <iostream> 2 #include &l

HDU 1426 Sudoku Killer DFS 简单题

给出一个数独的一部分,然后然后要我们填完整这个数独. Input 本题包含多组测试,每组之间由一个空行隔开.每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开.其中1-9代表该位置的已经填好的数,问号(?)表示需要你填的数. Output 对于每组测试,请输出它的解,同一行相邻的两个数用一个空格分开.两组解之间要一个空行.对于每组测试数据保证它有且只有一个解. Sample Input 7 1 2 ? 6 ? 3 5 8 ? 6 5 2 ? 7 1 ? 4 ? ? 8 5 1