解题思路:
只存在两种草丛,要么单独的小草丛,要么是两块连成一个的草丛。就算有三块以上的小草丛连在一起,也不会算作一个,而是被分成小块再计算,比方说:
====
.##
##.
====
这种形状的就会被算作两个或者三个,具体取决于算法。
由于是从左到右,从上到下遍历,所以当遍历到‘#’时,只需要再检测一下它右边和下边有无‘#’,然后一起消掉就可以了。
注意事项:
有两种算法,一种是先检测下边再检测右边,一种是先检测右边再检测下边。根据不同算法会得出不同的答案。比如:
=======
.####
##.#.
.##.#
..#..
=======
像这种草丛,先下再右的话答案是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分
4 人评分
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:855 |
母牛的故事 (C语言代码)浏览:478 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:737 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:910 |
2^k进制数 (C语言描述,蓝桥杯)浏览:1457 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:571 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:523 |
矩形面积交 (C语言代码)浏览:1433 |
C语言程序设计教程(第三版)课后习题12.6 (C语言代码)浏览:732 |
1162答案错误,为什么浏览:700 |