算是刚刚了解了广度优先搜索吧,bfs——广度优先搜索,适用于求最短最小问题,用广度优先搜索得到的答案一定是最短最小的。
bfs需要用到的是队列queue,队列queue fifo表(先入先出)
C++队列Queue类成员函数如下:
back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数
广搜步骤
从谁开始就把谁存到队列里,从它开始进行以后的步骤,广搜的话会遇到许多分支,每遇到一个分支就要push进队列里,每次处理判断时都要处理最前边的,即front(),处理的同时也要将其pop()掉方便可以一直处理front()。在处理的过程中也要判断找寻是否是结果,进行判断。进行广搜要灵活将struct与queue结合使用。
蓝桥杯2017初赛 跳蚱蜢
如图所示: 有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。
我们把这些蚱蜢顺时针编号为 1~8。每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。
请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?
思路:
状态压缩+bfs,把这个想象成一个字符串“012345678”通过左移1,左移2,右移1,右移2最终变成“087654321”
#include<iostream>
#include<memory.h>
#include<stack>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#include<sstream>
#include<set>
#include<queue>
using namespace std;
struct node
{
string str;
int pos;
int step;
node(string str, int pos, int step) :str(str), pos(pos), step(step) {}//构造函数
};
int N = 9;
set<string> visited;//2 set来记录搜索过的
queue<node> q;//1 广度搜索需要 struct和queue函数配合
void insertq(node x, int i)
{
string s = x.str;
swap(s[x.pos], s[(x.pos + i + 9) % 9]);//用滚动数组来记录,对于这种数量不变的队可以这么用
if (visited.count(s) == 0)
{
visited.insert(s);
node n(s, (x.pos + i + 9) % 9, x.step + 1);
q.push(n);//5 广度搜索
}
}
int main(int argc, char const* argv[])
{
node first("012345678", 0, 0);
q.push(first);
while (!q.empty())
{
node temp = q.front();
if (temp.str == "087654321")
{
cout << temp.step;
break;//4 出口
}
else
{
insertq(temp, 1);
insertq(temp, -1);
insertq(temp, 2);
insertq(temp, -2);
q.pop();//3 框架搭建好
}
}
return 0;
}
关于广度优先搜索我也刚学习,现在懂得不是很多,还需多加练习掌握