HDU 1426(数独 DFS)
Posted taskr212
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于HDU 1426(数独 DFS)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1426 Sudoku Killer(dfs 解数独)