C++最好的草 2022年6月c++二级 电子学会中小学生软件编程C++等级考试二级真题答案解析

C++最好的草

2022年6月 C++编程等级考试二级真题解析

博主推荐

  • 所有考级比赛学习相关资料合集【推荐收藏】

1、C++专栏 

  1. 电子学会C++一级历年真题解析
  2. 电子学会C++二级历年真题解析
  3. 蓝桥杯C++选拔赛真题解析
  4. 信息素养大赛C++算法编程挑战赛

 2、Python专栏

  1. 蓝桥杯python选拔赛真题详解
  2. 蓝桥杯python省赛真题详解
  3. 蓝桥杯python国赛真题详解
  4. 信息素养大赛python编程挑战赛
  5. python等级一级真题解析【电子学会】
  6. python等级二级真题解析【电子学会】
  7. python等级三级真题解析【电子学会】

一、题目要求

1、编程实现

奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个"#”。给定牧场地图,计算有多少个草丛,例如,考虑如下5行6列的牧场地图:

.#....
..#...
..#..#
...##.
.#....

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

2、输入输出

输入描述:第一行包含两个整数R和C,中间用单个空格隔开。 接下来R行,每行C个字符,描述牧场地图。字符只有"#"或".“两种。(1<= R,C<= 100)

输出描述:只有一行,一个整数,即有多少个草丛。

输入样例:

5 6
.#....
..#...
..#..#
...##.
.#....

输出样例:

5

二、算法分析

  1. 从给定题目的初步分析可以看出,这是一个矩阵查找,也是比较经典的独立岛屿问题
  2. 解决这个问题的方法也有很多,最常用的就属深度优先搜索算法BFS
  3. 所以我这边就使用BFS的方式进行解题,关键点在于每个节点都可以朝着四个方向进行搜索,只要四个方向有相邻的草丛,就表示联通的就是单独的一块草地;
  4. 所以可以遍历整个矩阵,当遇到草丛就向四个方向搜索是否有存在相邻的草丛,如果有就一直搜索,直到四个方向都没有遇到草丛,统计个数就加1
  5. BFS的实现需要借助队列queue,同时还得声明一个方向的二维数组,存放四个方向对应的x和y轴的坐标变化;而队列里面存放的是每一个矩阵中的节点,节点包含横纵坐标
  6. BFS实现过程是将当前草丛对应的坐标节点进行入队,然后循环判断队列是否为空,如果不为空就获取当前队首元素,并进行出队;出队的这个元素的四个方向是否存在草丛,如果存进行标记表示访问,同时将该节点加入队列;如此循环结束后就可以得到相连通的草丛

三、程序编写

#include
#include
using namespace std;
void bfs(int x,int y);
bool vis[101][101];
char a[101][101];
int r,c;
int f[4][2] = {0,1,0,-1,-1,0,1,0};
struct Node{
	int x;
	int y;
};
int main()
{
	int res = 0;
	cin >> r >> c;

	for(int i = 0;i < r;i++){
		for(int j = 0;j < c;j++){
			cin >> a[i][j];
		}
	}
	
	for(int i = 0;i < r;i++){
		for(int j = 0;j < c;j++){
			if(a[i][j] == '#' && !vis[i][j]){
				bfs(i,j);
				res ++;
			}
		}
	}
	cout << res << endl;
	return 0;
} 

void bfs(int x,int y){
	queue q;
	Node node,start;
	node.x = x;
	node.y = y;
	q.push(node);
	while(!q.empty()){
		start = q.front();
		q.pop();
		for(int k = 0;k < 4;k++){
			int tx = start.x + f[k][0];
			int ty = start.y + f[k][1];
			if(tx >= 0 && tx < r && ty >= 0 && ty < c && !vis[tx][ty] && a[tx][ty] == '#'){
				vis[tx][ty] = true;
				q.push({tx,ty});
			}
		}
	}
}

 本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102

四、运行结果

5 6
.#....
..#...
..#..#
...##.
.#....

5

五、考点分析

难度级别:难,这题相对而言对二级来说是比较难的,具体主要考察如下:

  1. 分析题目 找到解题思路
  2. 充分掌握数组的定义和使用
  3. 学会深度优先搜索算法BFS的原理和实现过程
  4. 学会数据结构队列queue的原理和使用方法
  5. 学会自定义结构和自定义函数的使用
  6. 学会输入流对象cin的使用,从键盘读入相应的数据
  7. 学会for循环的使用,在确定循环次数的时候推荐使用
  8. 学会while循环的使用,在不确定循环次数的时候推荐使用
  9. 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
  10. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  11. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  12. 充分掌握数组定义和使用、分支语句、循环语句和BFS算法知识的使用及输入输出的用法

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

你可能感兴趣的:(c++最好的草,c++考级编程题,c++考级二级真题,c++编程案例,c++二级真题,c++蓝桥杯题目,c++算法挑战赛)