其实和1241是一个题 就是 把上下左右的四个方向连在一起的#是为片# 问图中有几篇#
ps:打得时候搜索方向的向量的坐标打错了 找了半天 哎 注意一下吧
方法和1421一样 并且方向少了 变为4个 (1241的方向是直接粘贴的 看来有的东西只是看懂看不行 一定要亲自打一下 实践一下才行)
在图中找到一个#使用一次dfs标记所有相连的# 总数+1;(见1241)
1 #include<iostream>
2 #include<cstdio>
3 #include<string>
4 #include<queue>
5 using namespace std;
6 int f[4][2]={0,1,1,0,0,-1,-1,0};
7 bool visit[100][100]={0};
8 char map[100][100];
9 int n,m;
10 void dfs(int x,int y)
11 {
12 int i,j,k,dx,dy;
13 visit[x][y]==1;
14 for(i=0;i<4;i++)
15 {
16 dx=x+f[i][0];
17 dy=y+f[i][1];
18 if(dx>=0 && dx<n && dy>=0 && dy<m && map[dx][dy]=='#' && visit[dx][dy]==0)
19 {
20 visit[dx][dy]=1;
21 dfs(dx,dy);
22 }
23
24 }
25 return;
26 }
27 int main()
28 {
29
30 int ncase,i,j,k,ans;
31 scanf("%d",&ncase);
32 for(i=0;i<ncase;i++)
33 {
34
35 memset(map,0,sizeof(map));
36 memset(visit,0,sizeof(visit));
37
38 scanf("%d %d",&n,&m);
39 getchar();
40 ans=0;
41 for(j=0;j<n;j++)
42 {
43 for(k=0;k<m;k++)
44 scanf("%c",&map[j][k]);
45 getchar();
46 }
47 for(j=0;j<n;j++)
48 {
49 for(k=0;k<m;k++)
50 {
51 if(map[j][k]=='#'&& visit[j][k]==0)
52 {
53
54 dfs(j,k);
55 visit[j][k]=1;
56 ans++;
57 }
58
59 }
60 }
61 printf("%d\n",ans);
62 }
63 //system("pause");
64 return 0;
65 }