题目:http://poj.org/problem?id=1475
一眼看上去就能确定是BFS,但这题和普通寻找终点的BFS不一样,除了自身的位置,状态上还要体现箱子的位置。由于题目要求最少push最少walk,因此可以A*。
一个重要的问题是,搜到了之后如何生成路径,可以这么考虑:A*搜索使得我们到达终点完成任务时,走的路径时最优的,由于状态间是一步转移的,因此上一个状态形成的路径也肯定是最优的,这样一直找到最优的起点push = 0, walk = 0,由于搜索时已经保存了各个最优状态(用于剪枝),因此可以递归的打印路径。
一开始犯了个错误,在生成路径时没有完整考虑推操作和走操作需要的条件WA了一次,推操作箱子的上一个位置及人现在的位置,而走操作的上一位置不能和箱子现在的位置一样,看了Discuss中的数据发现问题所在,改了之后即A了。
#include <cstdio>
#include <cctype>
#include <c