题目链接:http://poj.org/problem?id=1077
这个用BFS、双向BFS、Astar都能解决,这里先用双向BFS来做。
因为要输出路径,多以不能直接用STL中的queue容器,不然出队后就找不到了,所以就自己封装了一个队列,用数组模拟的,还增加了输出路径的功能,留下来当做模板来用。
这里让空格走四个方向,把状态按照题目给的方式排成一列,用康拓展开来记录状态,用两个队列同时从起点和终点出发,搜索四个方向,如果碰到在一个队列搜索到的新状态在另一个队列中出现过,这个时候就可以输出路径了。
要注意的是在逆向搜索的队列中所有的方向都是反的,注意 u 和 d 对换,l 和 r 对换。
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int fac[9] = {1,1,2,6,24,120,720,5040,40320};
const int dx[4] = {-1,0,1,0};
const int dy[4] = {0,1,0,-1};
struct node
{
char state[12];
int pos;
int pre;
ch