HDU 1241

这题意也是醉.

简单dfs;对于一个油田"@"来说,上下左右斜上斜下八个方向如果也是"@"的话,就算同一个;那么,就用深搜搜呗..

每次找到一个"@",就把所有的跟他相关联的全部标记上,然后继续找下一个;

AC代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <queue>
 6 #include <math.h>
 7 const int dx[8]= {0,0,-1,1,-1,-1,1,1};
 8 const int dy[8]= {1,-1,0,0,-1,1,-1,1};
 9 using namespace std;
10 int vis[200][200],n,m,sum;
11 char s[205][205];
12 void dfs(int x,int y)
13 {
14     for(int i=0;i<8;i++)
15     {
16         int kx=x+dx[i];
17         int ky=y+dy[i];
18         if(kx>=0&&kx<n&&ky>=0&&ky<m&&vis[kx][ky]==0&&s[kx][ky]=='@')
19         {
20 //            sum++;  英语太渣,,不过题意不是说An oil deposit will not contain more than 100 pockets. 妈哒还是英语太渣.
21 //            if(sum>100)
22 //            {
23 //                return ;
24 //            }
25             vis[kx][ky]=1;
26             dfs(kx,ky);
27         }
28     }
29     return ;
30 }
31 int main()
32 {
33     while(~scanf("%d%d",&n,&m))
34     {
35         if(n==0&&m==0)
36         {
37             break;
38         }
39         memset(vis,0,sizeof(vis));
40         for(int i=0;i<n;i++)
41         {
42             scanf("%s",s[i]);
43         }
44         int cnt=0;
45         for(int i=0;i<n;i++)
46         {
47             for(int j=0;j<m;j++)
48             {
49                 if(s[i][j]=='@'&&vis[i][j]==0)//每次都找一个没被搜过的点,这个点一定和他关联的点一定算一个新的点.
50                 {
51 //                    sum=1;
52                     dfs(i,j);
53                     cnt++;
54                 }
55             }
56         }
57         printf("%d
",cnt);
58     }
59     return 0;
60 }
View Code
原文地址:https://www.cnblogs.com/qioalu/p/4922479.html