搜索-油田合并

 1 //理解dfs的实现,主要是回溯时的退出表现
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cstring>
 5 
 6 using namespace std;
 7 
 8 const int maxn=102;
 9 int n,m;
10 int visited[maxn][maxn];
11 char map[maxn][maxn];
12 int cnt;
13 
14 void dfs(int i,int j)
15 {
16     if(i+1<n&&visited[i+1][j]==0&&map[i+1][j]=='@')
17         dfs(i+1,j);
18     else if(i-1>=0&&visited[i-1][j]==0&&map[i-1][j]=='@')
19         dfs(i-1,j);
20     else if(j-1>=0&&visited[i][j-1]==0&&map[i][j-1]=='@')
21         dfs(i,j-1);
22     else if(j+1<m&&visited[i][j+1]==0&&map[i][j+1]=='@')
23         dfs(i,j+1);
24     else if(i-1>=0&&j-1>=0&&visited[i-1][j-1]==0&&map[i-1][j-1]=='@')
25         dfs(i-1,j-1);
26     else if(i+1<n&&j+1<m&&visited[i+1][j+1]==0&&map[i+1][j+1]=='@')
27         dfs(i+1,j+1);
28     else if(i-1>=0&&j+1<m&&visited[i-1][j+1]==0&&map[i-1][j+1]=='@')
29         dfs(i-1,j+1);
30     else if(i+1<n&&j-1>=0&&visited[i+1][j-1]==0&&map[i+1][j-1]=='@')
31         dfs(i+1,j-1);
32 }
33 
34 int main()
35 {
36     while(scanf("%d%d",&n,&m)!=EOF&&m)
37     {
38         cnt=0;
39         memset(visited,0,sizeof(visited));
40         for(int i=0;i<n;i++)
41         {
42             for(int j=0;j<m;j++)
43             {
44                 cin>>map[i][j];
45             }
46         }
47         
48         for(int i=0;i<n;i++)
49         {
50             for(int j=0;j<m;j++)
51             {
52                 if(map[i][j]=='@'&&visited[i][j]==0)
53                 {
54                     dfs(i,j);
55                     cnt++;
56                 }
57             }
58         }
59         
60         printf("%d\n",cnt);
61     }
62     return 0;
63 }

猜你喜欢

转载自www.cnblogs.com/chuanwen-tech/p/10279824.html
今日推荐