题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
第一次写搜索代码 花了好大的功夫检查 看了别人的结题报告 还是错误一大堆 哎
题目是这样的 @表示油田 *表示非油田 @与其八个方向@组成一片连续油田 一个@*组成的图 文有几片油田
思路:没被标记找大一个@ 在使用dfs 把所有的相连的油田都标记为已查找
然后油田片数+1;
知道找完所有的点;
用递归的方式实现深搜
1 #include<iostream>
2 #include<string>
3 #include<queue>
4 usingnamespace std;
5 int ans=0;
6 bool visit[100][100]={0};//用一个 bool数组表示是否被找过
7 char map[100][100];//存储图形
8 int n,m;
9 int f[8][2]={1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,-1,-1,1};//没两位表示一个方向 8个方向
10 void dfs(int x,int y)
11 { int i,j,k,dx,dy;
12 visit[x][y]=1;
13 for(i=0;i<8;i++)
14 {
15
16 dx=x+f[i][0];
17 dy=y+f[i][1];
18 if(dx<0|| dy<0|| dx>=m || dy>=n || map[dx][dy]=='*'|| visit[dx][dy]==1)//改了很多次才改对 这就是菜鸟
//打得时候忘了visit[dx][dy]==1
19 continue;
20 if(map[dx][dy]=='@'&& visit[dx][dy]==0)
21 {visit[dx][dy]=1;
22 dfs(dx,dy);//使用了递归的方式 容易理解
23 }
24 }
25 return ;
26 }
27 int main()
28 {
29 int i,j;
30 while(scanf("%d %d",&m,&n)!=EOF)
31 {
32 getchar();//下面要输入字符 所以要用getchar 接受回车
33 ans=0;
34 memset(map,0,sizeof(map));
35 memset(visit,0,sizeof(visit));
36 if(n==0&& m==0)
37 {
38 break;
39 }
40 for(i=0;i<m;i++)
41 {
42 for(j=0;j<n;j++)
43 {
44 scanf( "%c",&map[i][j] );
45 }
46 getchar();
47 }
48 for(i=0;i<m;i++)
49 {
50 for(j=0;j<n;j++)
51 {
52 if(visit[i][j]==0&& map[i][j]=='@')
53
54 {
55 dfs(i,j);
56 ans++;
57 }
58 }
59 }
60 printf("%d\n",ans);
61 }
62 //system("pause");
63 return0;
64 }