Description
贝茜正计划着这一天如何美美地咀嚼春天的绿草,远望着农民约翰钟爱的并被分割为R (1 <= R <= 100) 行和 C (1 <= C <= 100) 列的草场。她想去数一数草场有多少个草丛。
每个草丛在地图上用'#'来表示,或者两个'#'连在一起(但不是在一个对角线),给出草场地图,请告诉贝茜草场上一共有多少个草丛。
例如,下面有一张草场地图 R=5, C=6:
.#....
..#...
..#..#
...##.
.#....
这个草场一共有5个草丛。(1,2);(2,3)+(3,3);(3,6);(4,4)+(4,5);(5,2)
Input
*输入包含多组测试数据
*对于每组测试数据:
* 第 1 行: 2个用空格隔开的整数 R , C
* 第 2 至 R+1 行: 草场地图信息
Output
* 对于每组测试数据输出草场上草丛的总个数。
Sample Input
5 6 .#.... ..#... ..#..# ...##. .#....
Sample Output
5
对于该题,只限定两个连在一起,或一个单独的。所以代码很简单;
#include<stdio.h> #include<string.h> int main() { int n,m,i,t=0,j; char str[101][101],a[101][101]; while (scanf("%d%d",&n,&m)!=EOF){ t=0; memset(a,0,sizeof (a)); for (i=0;i<n;i++) scanf("%s",str[i]); for (i=0;i<n;i++) for (j=0;j<m;j++){ if (str[i][j]=='#'&&a[i][j]==0){ t++; a[i][j+1]=1; a[i+1][j]=1; } } printf("%d\n",t); } return 0; }
如果可以是多个草地连在一起,则上面的代码就不能实现。
用深度优先搜索(DFS) 可以解决这个问题。
用两个数组,一个记录输入的字符,另一个记录走过的位置。
#include<stdio.h> #include<string.h> int a,b,r,c; int N[110][110]; char ch[110][110]; void dfs(int i,int j) { N[i][j]=1; if((i+1<r)&&(ch[i+1][j]=='#')&&(N[i+1][j]==0)) dfs(i+1,j); if((j-1>=0)&&(ch[i][j-1]=='#')&&(N[i][j-1]==0)) dfs(i,j-1); if((i-1>=0)&&(ch[i-1][j]=='#')&&(N[i-1][j]==0)) dfs(i-1,j); if((j+1<c)&&(ch[i][j+1]=='#')&&(N[i][j+1]==0)) dfs(i,j+1); if(i==a&&j==b) return; } int main() { while(scanf("%d %d",&r,&c)!=EOF) { int sum=0; memset(N,0,sizeof(N)); for( a=0;a<r;a++) scanf("%s",&ch[a]); for( a=0;a<r;a++) for( b=0;b<c;b++) { if((ch[a][b]=='#')&&(N[a][b]==0)) { dfs(a,b); sum++; } } printf("%d\n",sum); } return 0; }