首页 > 代码库 > DFS & BFS

DFS & BFS

 

1.数独 DFS

 技术分享

问题:用数字1-9填充该9×9的数据块,条件:空位置填数,该行、该列、该所在的3×3(黑线划分)小块,不得有重复出现的数字

思路:DFS

用三个二维数组分别存储:值为 1则说明出现过

  r[i][x]  第 i 行 x 值 是否出现过

  c[j][x] 第 j 列 x 值 是否出现过 

  b[k][x] 第 k 快(该9×9 的数独区由9块3×3的小区域组成) x 值是否出现过 :(i/3*3+j/3 这个很重要,用来判断该位置属于那个块)

定义一个结构体数组存放空点位置,每次DFS递归空点位置的下标,如果下标打过了空点的总数量,则递归结束。

写完记得 memset 三个数组。

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 struct P
 5 {
 6     int x,y;
 7 } p[81];
 8 char s[9][9];
 9 int r[10][10],c[10][10],b[10][10];
10 int ok,cut;
11 void init()
12 {
13     int k=0;
14     for(int i=0; i<9; i++)
15         for(int j=0; j<9; j++)
16             if(s[i][j]!=0)
17                 r[i][s[i][j]-0]=c[j][s[i][j]-0]=b[i/3*3+j/3][s[i][j]-0]=1;
18             else
19                 p[cut].x=i,p[cut].y=j,cut++;
20 }
21 int check(int x,int y,int v)
22 {
23     if(r[x][v]||c[y][v]||b[x/3*3+y/3][v])return 0;
24     return 1;
25 }
26 void print()
27 {
28     for(int i=0; i<9; i++)
29     {
30         for(int j=0; j<9; j++)
31             printf("%c",s[i][j]);
32         printf("\n");
33     }
34 }
35 void dfs(int step)
36 {
37     if(step==cut)
38     {
39         ok=1;
40         print();
41         return ;
42     }
43     int xx,yy;
44     for(int i=1; i<10; i++)
45     {
46         if(check(p[step].x,p[step].y,i))
47         {
48             xx=p[step].x,yy=p[step].y;
49             r[xx][i]=c[yy][i]=b[xx/3*3+yy/3][i]=1;
50             s[xx][yy]=i+0;
51             dfs(step+1);
52             if(ok)return;
53             r[xx][i]=c[yy][i]=b[xx/3*3+yy/3][i]=0;
54             s[xx][yy]=0;
55         }
56     }
57 }
58 int main()
59 {
60     int T;
61     scanf("%d",&T);
62     while(T--)
63     {
64         memset(c,0,sizeof(c));
65         memset(r,0,sizeof(r));
66         memset(b,0,sizeof(b));
67         cut=ok=0;
68         for(int i=0; i<9; i++)
69             scanf("%s",s[i]);
70         init();
71         dfs(0);
72     }
73     return 0;
74 }
View Code

 

DFS & BFS