BFS基本操作
BFS不像DFS利用递归实现,它简单易上手,一般处理“单位时间走不同步数,求最短时间”的问题
例题如下:
解答如下:
/*
-------------------------------------------------
Author: wry
date: 2022/2/28 16:16
Description: BFS
-------------------------------------------------
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
struct Location {
int position;
int time;
Location(){}
Location(int p,int t):position(p),time(t){}
};
bool visit[MAXN];
int BFS(int start,int end) {
//1.将初始点加入队列,视为根节点
queue<Location> myQueue;
myQueue.push(Location(start,0));
visit[start] = true;
//2.循环处理队列内容(先进先出)
while (!myQueue.empty()) {
//3.每次先检查是否已经处理到了
Location current = myQueue.front();
if (current.position==end) {
return current.time;
}
//4.每次弹出一个,压入三个,如果曾经压入过或者已经出界则跳过
myQueue.pop();
for (int i=0;i<3;i++) { //3种前进方式
Location next(current.position,current.time+1);
if (i==0) {
next.position -= 1;
}
else if (i==1) {
next.position += 1;
}
else if (i==2) {
next.position *= 2;
}
//5.如果出错,跳过
if (next.position<0 || next.position>1e5 || visit[next.position]) {
continue;
}
//6.没有出错,压入
else {
myQueue.push(next);
visit[next.position] = true;
}
}
}
}
int main() {
int start,end;
cin >> start >> end;
memset(visit,false,sizeof(visit));
cout << BFS(start,end);
return 0;
}