首页 > 代码库 > 挑战程序2.1.4 穷竭搜索>>深度优先搜索

挑战程序2.1.4 穷竭搜索>>深度优先搜索

{‘W‘,‘.‘,‘.‘,‘W‘,‘.‘},
{‘W‘,‘.‘,‘.‘,‘.‘,‘.‘},
{‘.‘,‘.‘,‘.‘,‘W‘,‘.‘},
{‘W‘,‘.‘,‘.‘,‘.‘,‘.‘},
{‘W‘,‘.‘,‘W‘,‘W‘,‘W‘}例子,此处有5处积水

  题目:有N*M格子的花园,W表示积水,‘.‘表示干地,积水附近8个区域只要有积水,那么这两处连通,并算作是同一处积水,问一共有几处积水?

    思路:穷竭搜索,O(N*M),搜索到积水则变成‘.’,并搜索连通的积水将其变成‘.’,直到这块积水搜索结束,此时a+=1,此处积水全变为‘.’

 1 #include <stdio.h>
 2 void dfs(int x,int y);
 3 void solve();
 4     int N=5,M=5;
 5         char ch[5][5]={
 6                         {W,.,.,W,.},
 7                         {W,.,.,.,.},
 8                         {.,.,.,W,.},
 9                         {W,.,.,.,.},
10                         {W,.,W,W,W}
11                       };
12 int main()
13 {
14 
15     solve();
16     return 0;
17 }
18 
19 void dfs(int x,int y)
20 {
21     ch[x][y]=.;
22     for(int x1=-1;x1<=1;x1++)
23         for(int y1=-1;y1<=1;y1++)
24     {
25         int nx=x+x1,ny=y+y1;
26         if(nx>=0&&nx<N&&ny>=0&&ny<M&&ch[nx][ny]==W)//nx,ny不能超出园子
27             dfs(nx,ny);
28     }
29     return ;
30 }
31 
32 void solve()
33 {
34     int a=0;
35     for(int i=0;i<N;i++)
36         for(int k=0;k<M;k++)
37         if(ch[i][k]==W)
38         {
39             dfs(i,k);
40             a++;
41         }
42     printf("%d\n",a);
43 }

此处演示5*5,5块积水的代码。

Tips:深度优先搜索DFS,从最开始出发,遍历所有可能性,对其进行操作或列举。

挑战程序2.1.4 穷竭搜索>>深度优先搜索