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;
}

  

posted @ 2022-02-28 17:00  火星架构师  阅读(135)  评论(0编辑  收藏  举报