NOI1.8.17 最好的草 题解(C++)

NOI1.8.17 最好的草 题解

题目传送门
先来一个图片:
NOI1.8.17 最好的草 题解(C++)_第1张图片
上下上下。。。
这一次的题目也不错,难度适中。
直接上题目:

题目

17:最好的草

总Time Limit: 10000ms 单个测试点时间限制: 1000ms Memory Limit: 65536kB
Description
奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量。

在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个“#”。给定牧场地图,计算有多少个草丛。

例如,考虑如下5行6列的牧场地图

.#…
…#…
…#…#
…##.
.#…
这个牧场有5个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。

Input
第一行包含两个整数R和C,中间用单个空格隔开。
接下来R行,每行C个字符,描述牧场地图。字符只有“#”或“.”两种。(1 <= R, C <= 100 )
Output
输出一个整数,表示草丛数。
Sample Input
5 6
.#…
…#…
…#…#
…##.
.#…
Sample Output
5

思路

有点像流感传染,不是吗?
输入完后直接双重for遍历一遍,如果遇到’#‘字符就调用递归函数把周围的统统变成’.‘然后向下继续递归,知道没有’#'为止。

代码

#include
#include
using namespace std;
char map[105][105];
int n,m;
void fill(int x,int y){
	if(x-1>=0/*预判很重要*/&&map[x-1][y] == '#'){
		map[x-1][y] = '.';
		fill(x-1,y);
	}
	if(y-1>=0&&map[x][y-1] == '#'){
		map[x][y-1] = '.';
		fill(x,y-1);
	}
	if(x+1<n&&map[x+1][y] == '#'){
		map[x+1][y] = '.';
		fill(x+1,y);
	}
	if(y+1<m&&map[x][y+1] == '#'){
		map[x][y+1] = '.';
		fill(x,y+1);
	}
	
}
int main(){
	int counter = 0;
	cin>>n>>m;
	for(int i = 0;i<n;i++){
		for(int j = 0;j<m;j++){
			cin>>map[i][j];
		}
	}
	for(int i = 0;i<n;i++){
		for(int j = 0;j<m;j++){
			//暴力遍历
			if(map[i][j] == '#'){
				fill(i,j);
				counter++;
			}
		}
	}
	cout<<counter;
	return 0;	
}

你可能感兴趣的:(信息学,题解)