奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个“#”。给定牧场地图,计算有多少个草丛。
例如,考虑如下5行6列的牧场地图
.#.... ..#... ..#..# ...##. .#....
这个牧场有5个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。
输入
第一行包含两个整数R和C,中间用单个空格隔开。
接下来R行,每行C个字符,描述牧场地图。字符只有“#”或“.”两种。(1 <= R, C <= 100 )
输出
输出一个整数,表示草丛数。
样例输入
5 6 .#.... ..#... ..#..# ...##. .#....
样例输出
5
第一次尝试的代码,含有单步检查
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void printarr(char arr[101][101],int line,int column)
{
int i,j;
printf("every time answer is \n");
for(i=0;i<line;i++)
{
for(j=0;j<column;j++)
{
printf("%c",arr[i][j]);
}
printf("\n");
}
}
int main()
{
int line ,column;
scanf("%d %d",&line,&column);
char arr[101][101],tmp[101][101];
int i,j;
int count=0;
for(i=0;i<line;i++)
{ getchar();
for(j=0;j<column;j++)
{
scanf("%c",&arr[i][j]);
tmp[i][j]=arr[i][j];
}
}
int ii,jj;
for(i=0;i<line;i++)
{
for(j=0;j<column;j++)
{
if(arr[i][j]=='#')
{
count++;
/*
for(ii=-1;ii<=1;ii++)
{
for(jj=-1;jj<=1;jj++)
{
if(arr[i+ii][j+jj]=='#')
{
arr[i+ii][j+jj]='.';
}
}
}
不是这种,这种是旁边的8个都要判断,这个是只要判断旁边的4个
*/
if(arr[i][j-1]=='#')
{
arr[i][j-1]='.';
}
if(arr[i][j+1]=='#')
{
arr[i][j+1]='.';
}
if(arr[i-1][j]=='#')
{
arr[i-1][j]='.';
}
if(arr[i+1][j]=='#')
{
arr[i+1][j]='.';
}
printarr(arr,line,column);
}
}
}
printf("%d",count);
return 0;
}
最终的结果
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int line ,column;
scanf("%d %d",&line,&column);
char arr[101][101],tmp[101][101];
int i,j;
int count=0;
for(i=0;i<line;i++)
{ getchar();
for(j=0;j<column;j++)
{
scanf("%c",&arr[i][j]);
tmp[i][j]=arr[i][j];
}
}
int ii,jj;
for(i=0;i<line;i++)
{
for(j=0;j<column;j++)
{
if(arr[i][j]=='#')
{
count++;
/*
for(ii=-1;ii<=1;ii++)
{
for(jj=-1;jj<=1;jj++)
{
if(arr[i+ii][j+jj]=='#')
{
arr[i+ii][j+jj]='.';
}
}
}
不是这种,这种是旁边的8个都要判断,这个是只要判断旁边的4个
*/
if(arr[i][j-1]=='#')
{
arr[i][j-1]='.';
}
if(arr[i][j+1]=='#')
{
arr[i][j+1]='.';
}
if(arr[i-1][j]=='#')
{
arr[i-1][j]='.';
}
if(arr[i+1][j]=='#')
{
arr[i+1][j]='.';
}
}
}
}
printf("%d",count);
return 0;
}