前段时间学完BFS很开心地发现oj上有些题可以做了!但是记录路径又把我难住了,,,赶紧去学习一下,本篇算是复习BFS和它的记录路径方法吧。
还是以题引例:1086 迷宫问题 1220 Look for homework 1654 Treasure House
以1654为例:
1654 Treasure House
选这个题是因为学这种方法的时候就是做的这个题啦 :P(才不是因为要把师哥挂出来orz)
大概意思就是说给定n*m的矩阵,矩阵由字符$和#组成,$位置可以走,#不能走,求左上角到右下角的最短路程并按照字典序最大输出路径。
很显然搜索方法使用BFS,即模拟队列方法搜索,广度优先寻找最短路径,但是需要找出最短路径,我们使用的方法是另开结构体存路径。
下面根据代码理解叙述:
1 |
|
定义变量部分,注意方向数组dx[4]和dy[4],初始化值时有很大讲究,因为我们要按照字典序最大输出,所以按照字典序四个方向应为W,S,N,E,按照上北下南左西右东(废话)给两个数组一一对应赋值(千万看仔细,如果搞错了就肯定WA)。
1 | struct node |
自定义函数部分,详细解释在代码中(语文学得不好,如果有些话讲的不对劲请见谅 ^_^ )。
1 | int main() |
主函数部分,调用了bfs()、print()两个函数。
1220 Look for homework
这个题我做的时候觉得很坑,因为你会发现输入的数字之间莫得空格,那么输入的是字符串,不能定义int数组。。。结果另一个同学做的时候完全没被这个点绊到,,,是我太菜了QAQ
这个题是最小字典序,和上面那个题不一样了哦
下面放AC代码:
1 |
|
1086 迷宫问题
这个题比较不同的是输出的是坐标,注意格式,有空格的地方一定带空格,一般直接复制输出样例再改一下数字就好了。这个题简单一些,题目告诉了有唯一解,直接输出记录最短路径即可。注意这个地方给定左上角为(0,0),别写成(1,1)!!!
AC代码:
1 |
|
打败遗忘最好的方法是多复习多做类似题!多复习多复习~
如有错误请赐教 Orz
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !