解题思路:
只存在两种草丛,要么单独的小草丛,要么是两块连成一个的草丛。就算有三块以上的小草丛连在一起,也不会算作一个,而是被分成小块再计算,比方说:
====
.##
##.
====
这种形状的就会被算作两个或者三个,具体取决于算法。
由于是从左到右,从上到下遍历,所以当遍历到‘#’时,只需要再检测一下它右边和下边有无‘#’,然后一起消掉就可以了。
注意事项:
有两种算法,一种是先检测下边再检测右边,一种是先检测右边再检测下边。根据不同算法会得出不同的答案。比如:
=======
.####
##.#.
.##.#
..#..
=======
像这种草丛,先下再右的话答案是8,先右再下的话答案是7。
本题的答案应该是选用了先下后右的算法,如果你编写的代码选择了先右后下的算法,那大概率就一片红了。
如果要追求让草丛数量最少的最优算法,那难度应该要上天去,反正我这水平是不行了。
参考代码:
#include<stdio.h>
int main()
{
int m,n;
scanf("%d%d",&m,&n);
char a[102][102]={0}; //建一个足够大的字符矩阵并初始化
int i=0,j=0;
for(i=0;i<m;i++){
scanf("%s",&a[i][0]); //一行一行的将题目给的地图输入数组a
}
int num=0; //草丛计数器
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(a[i][j]=='#'){
a[i][j]='0'; //遍历数组,检测到草丛‘#’后将其消掉,随便拿个什么其他字符替换都行
num++; //草丛+1
if(a[i+1][j]=='#'){
a[i+1][j]='0'; //检测草丛下边有无连接的草丛,也消掉
}else if(a[i][j+1]=='#'){
a[i][j+1]='0'; //如果下边没有草丛,就检测草丛右边有无连接的草丛,也消掉。注意如果和下边和右边都有草丛,只能选一个消掉,所以要用else
}
}
}
}
printf("%d",num); //输出数量
return 0;
}
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复