算法学习006-瓷砖总数 广度优先算法BFS 中小学算法思维学习 信奥算法解析 c++实现-LMLPHP

目录

C++瓷砖总数

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、程序说明

五、运行结果

六、考点分析

七、推荐资料


C++瓷砖总数

一、题目要求

1、编程实现

在一个长方形房间,铺着不同颜色的的瓷砖,有红色和黑色,一个人站在黑色瓷砖上,他可以上下左右四个方向移动到相邻的瓷砖,但他不能再红色瓷砖上移动,只能在黑色瓷砖上移动,编程计算他可以到达的黑色瓷砖的数量

2、输入输出

输入描述:第一行包含两个整数n和m,n表示有多少行,m表示每行有多少列,且n和m均不超过20;接下来有n行,每行有m个字符;‘.’表示黑色,‘#’表示红色,'@'表示起点人所在黑色瓷砖上位置,数据中只能出现一次

输出描述:只有一行,一个整数,即这个人从初始位置能够到达的瓷砖总数(包括起点)

输入样例:

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

输出样例:

20

二、算法分析

  1. 从给定题目的初步分析可以看出,这是一个比较典型的陷阱迷宫问题
  2. 较好的方式是使用广度优先搜索的方式进行实现
  3. 从初始位置出发,然后分别从初始位置的上下左右四个方向进行搜索,并逐一进行处理
  4. 如果当前点位在矩阵中且都是黑色就继续进行相应的处理,处理完了一个接着又从四个方向继续搜索并处理,直到矩阵中的所有位置全部搜索完毕
  5. 要实现广度优先算法最好是结合使用队列的方式进行,将每一个处理的点进行入队,然后出队,出队之后就判断四个方向的点是否符合,符合就依次入队,然后再依次出队,直到全部出队完毕即搜索结束

三、程序编写

算法学习006-瓷砖总数 广度优先算法BFS 中小学算法思维学习 信奥算法解析 c++实现-LMLPHP

算法学习006-瓷砖总数 广度优先算法BFS 中小学算法思维学习 信奥算法解析 c++实现-LMLPHP

四、程序说明

  1. 首先,在主函数中,通过输入获取了矩阵的行数和列数n和m,并使用一个二维数组grid存储矩阵的内容
  2. 然后,通过遍历矩阵,找到起点位置的坐标(x, y)
  3. 接下来,调用BFS函数进行广度优先搜索。BFS函数的参数是起点位置的坐标(px, py)
  4. 首先,初始化res为1,表示起点位置也是一个黑色瓷砖
  5. 然后,定义一个队列p,用于存储待处理的节点
  6. 在BFS函数中,首先将起点位置加入队列p
  7. 然后,进行循环,直到队列p为空
  8. 在每次循环中,首先从队列p中取出一个节点start
  9. 然后,对该节点的四个相邻节点进行判断,若该节点在矩阵范围内并且该节点的值是'.',则将该节点的值修改为'#',表示已经访问过,并将该节点加入队列p,并将res加1
  10. 最后,BFS函数结束后,输出res,即为黑色瓷砖的数量
  11. 整体思路就是通过广度优先搜索遍历矩阵中的每个黑色瓷砖,将黑色瓷砖的节点标记为已访问,并统计黑色瓷砖的数量
  12. 最后返回0,程序结束

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

五、运行结果

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

20

六、考点分析

难度级别:男,这题相对而言还是有一定的难度,具体主要考查如下:

  1. 分析题目,找到解题思路
  2. 充分掌握二维矩阵的定义和使用
  3. 学会广度优先算法BFS的原理和应用
  4. 学会输入流对象cin的使用,从键盘读入相应的数据
  5. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  6. 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
  7. 学会if...else...双分支语句的使用,条件满足执行一种处理,不满足执行另一种处理
  8. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  9. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  10. 充分掌握二维矩阵定义和使用、分支语句、循环语句和广度优先算法知识的用法

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

七、推荐资料

05-08 14:49