目录
C++瓷砖总数
一、题目要求
1、编程实现
在一个长方形房间,铺着不同颜色的的瓷砖,有红色和黑色,一个人站在黑色瓷砖上,他可以上下左右四个方向移动到相邻的瓷砖,但他不能再红色瓷砖上移动,只能在黑色瓷砖上移动,编程计算他可以到达的黑色瓷砖的数量
2、输入输出
输入描述:第一行包含两个整数n和m,n表示有多少行,m表示每行有多少列,且n和m均不超过20;接下来有n行,每行有m个字符;‘.’表示黑色,‘#’表示红色,'@'表示起点人所在黑色瓷砖上位置,数据中只能出现一次
输出描述:只有一行,一个整数,即这个人从初始位置能够到达的瓷砖总数(包括起点)
输入样例:
5 6
. . # . . .
# # # . . .
. @ . . # .
. . # . . .
# . . . . #
输出样例:
20
二、算法分析
- 从给定题目的初步分析可以看出,这是一个比较典型的陷阱迷宫问题
- 较好的方式是使用广度优先搜索的方式进行实现
- 从初始位置出发,然后分别从初始位置的上下左右四个方向进行搜索,并逐一进行处理
- 如果当前点位在矩阵中且都是黑色就继续进行相应的处理,处理完了一个接着又从四个方向继续搜索并处理,直到矩阵中的所有位置全部搜索完毕
- 要实现广度优先算法最好是结合使用队列的方式进行,将每一个处理的点进行入队,然后出队,出队之后就判断四个方向的点是否符合,符合就依次入队,然后再依次出队,直到全部出队完毕即搜索结束
三、程序编写
四、程序说明
- 首先,在主函数中,通过输入获取了矩阵的行数和列数n和m,并使用一个二维数组grid存储矩阵的内容
- 然后,通过遍历矩阵,找到起点位置的坐标(x, y)
- 接下来,调用BFS函数进行广度优先搜索。BFS函数的参数是起点位置的坐标(px, py)
- 首先,初始化res为1,表示起点位置也是一个黑色瓷砖
- 然后,定义一个队列p,用于存储待处理的节点
- 在BFS函数中,首先将起点位置加入队列p
- 然后,进行循环,直到队列p为空
- 在每次循环中,首先从队列p中取出一个节点start
- 然后,对该节点的四个相邻节点进行判断,若该节点在矩阵范围内并且该节点的值是'.',则将该节点的值修改为'#',表示已经访问过,并将该节点加入队列p,并将res加1
- 最后,BFS函数结束后,输出res,即为黑色瓷砖的数量
- 整体思路就是通过广度优先搜索遍历矩阵中的每个黑色瓷砖,将黑色瓷砖的节点标记为已访问,并统计黑色瓷砖的数量
- 最后返回0,程序结束
本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102
五、运行结果
5 6
. . # . . .
# # # . . .
. @ . . # .
. . # . . .
# . . . . #
20
六、考点分析
难度级别:男,这题相对而言还是有一定的难度,具体主要考查如下:
- 分析题目,找到解题思路
- 充分掌握二维矩阵的定义和使用
- 学会广度优先算法BFS的原理和应用
- 学会输入流对象cin的使用,从键盘读入相应的数据
- 学会for循环的使用,在确定循环次数的时候推荐使用学会
- 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
- 学会if...else...双分支语句的使用,条件满足执行一种处理,不满足执行另一种处理
- 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
- 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
- 充分掌握二维矩阵定义和使用、分支语句、循环语句和广度优先算法知识的用法
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!