数独 dfs

Posted

tags:

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

@[email protected] 题目:

技术分享

(⊙v⊙)嗯,代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const int N = 9;
 6 const int Group[9][9] = {
 7     0, 0, 0, 1, 1, 1, 2, 2, 2,
 8     0, 0, 0, 1, 1, 1, 2, 2, 2,
 9     0, 0, 0, 1, 1, 1, 2, 2, 2,
10     3, 3, 3, 4, 4, 4, 5, 5, 5,
11     3, 3, 3, 4, 4, 4, 5, 5, 5,
12     3, 3, 3, 4, 4, 4, 5, 5, 5,
13     6, 6, 6, 7, 7, 7, 8, 8, 8,
14     6, 6, 6, 7, 7, 7, 8, 8, 8,
15     6, 6, 6, 7, 7, 7, 8, 8, 8
16 };
17 
18 int a[N][N],Line[N][N],Column[N][N],group[N][N]; 
19 
20 int print() {
21     for(int i=0; i<N; i++) {
22         for(int j=0; j<N; j++)
23             cout<<a[i][j]+1<<" ";
24             cout<<endl;
25     }
26 }
27 
28 void dfs(int x,int y) {
29     if(x == N) {
30         print();
31         return ;
32     }
33     int nxt_x = x,nxt_y = y + 1;
34     if(nxt_y == N) nxt_x = x + 1,nxt_y = 0; 
35     
36     if(a[x][y] >= 0) dfs(nxt_x,nxt_y);
37     else {
38         for(int i=0; i<N; i++) {
39             if(!Line[x][i] && !Column[y][i] && !group[Group[x][y]][i]) {
40                 Line[x][i] = Column[y][i] = group[Group[x][y]][i] = 1;
41                 
42                 a[x][y] = i;
43                 dfs(nxt_x,nxt_y);
44                 a[x][y] = -1;
45                 
46                 Line[x][i] = Column[y][i] = group[Group[x][y]][i] = 0;
47             }
48         }
49     }
50 }
51 
52 int main() {
53     for(int i=0; i<N; i++)
54         for(int j=0; j<N; j++)
55             cin>>a[i][j], a[i][j]--;
56     for(int i=0; i<N; i++)
57         for(int j=0; j<N; j++)
58             if(a[i][j] >= 0) {
59                 Line[i][a[i][j]] = 1,
60                 Column[j][a[i][j]] = 1,
61                 group[Group[i][j]][a[i][j]] = 1;
62             }
63     dfs(0,0);
64     return 0;
65 }

思路就是纯粹的dfs,类似于八皇后的问题

 

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

数独 (dfs)

洛谷 P1784 数独[DFS/回溯]

数独(dfs解)

NYOJ 722 数独(DFS)

POJ 2676 数独(DFS)

洛谷P1784 数独题解(DFS解法)