例题:P1397 八数码难题
普通BFS
双向BFS
所谓双向广度优先搜索指的是搜索沿两个方向同时进行
正向搜索:从初始点向目标点搜索;
逆向搜索:从目标点向初始点搜索;
从正反两个方向搜索,理论上可以节省二分之一的搜索量,从而提高搜索速度,节约内存空间。
从初始状态和目标状态向两个方向同时进行扩展,如果两颗解答树在某个节点发生一次重合,即可终止此搜索过程,则该节点所连接的两条路径所拼成的路径就是最优解
●双向广度优先搜索通常有两种搜索方法:
①、两个方向交替扩展;
②、选择结点个数较少的那个方向先扩展;
●实现方法:
建立两个队列分别拓展两个方向出发的状态。
每次while循环时只扩展正反两个方向中节点数目较少的一个,可以使两边的发展速度保持一定的平衡,从而减少总扩展节点的个数,加快搜索速度。
例题代码
#include<iostream>
#include<map>
#include<queue>
#include<cstring>
using namespace std;
map<string, int> ma,mb;
struct nod
{
string a;
int x, y;
};
queue<nod> qa,qb;
int dx[4] = {
1, -1, 0, 0};
int dy[4] = {
0, 0, 1, -1};
int main()
{
string aim = "123804765",a;
cin >> a;
if(a==aim)
{
cout << "0";
return 0;
}
for (int i = 0; i < 9;i++)
{
if(a[i]=='0')
qa.push({
a, i / 3, i % 3});
}
qb.push({
aim, 1, 1});
ma[a] = mb[aim] = 0;
while(!qa.empty()||!qb.empty())
{
if(qa.