BFS入门--POJ3278--抓羊

题目描述

BFS入门

广度优先搜索相比于深度优先搜索,从形态上差异很明显,一个是先搜索到最深,一个是一层层的先把当前层的每一个都搜索到,顾名思义的话,就是这样子,也确实是这样子。

gw老师的广搜流程图,讲得真的好啊。。

我写这道题时想过:既然广搜是逐层搜索,记录当前进入到第几层了,然后搜索到终点时,直接输出层数就好了呀。而郭伟老师直接把队列的每一个单位都定义成结构体,在结构体里面储存“走到这个点走的步数”,我觉得真的好麻烦啊!于是我自己试了一下“记录层数”,最终找到终点时直接输出层数 的想法,然后发现,其实最终写出来跟郭伟老师差不多,哈哈哈哈哈哈

熟悉一下队列的使用:

#include<queue>

struct node{
    bool mark;
    int value;
};

queue<node> str;

str.push(node(true,25));
str.front();
str.empty();
str.back();
str.pop();
str.size();

ac代码:

#include<iostream>
#include<queue> 
using namespace std;

const int maxn=100000;

struct node{
    int x,step;
    node(int xx,int ss):x(xx),step(ss){}
};

int visit[100010],b,e;

queue<node> s;

int main()
{
    cin>>b>>e;
    s.push(node(b,0));
    visit[b]=1;

    while(!s.empty()){
        node t=s.front();
        if(t.x==e){
            cout<<t.step<<endl;
            return 0;
        }
        else{
            if(t.x-1>=0 && !visit[t.x-1]){
                s.push(node(t.x-1,t.step+1));
                visit[t.x-1]=1;
            }
            if(t.x+1<=maxn && !visit[t.x+1]){
                s.push(node(t.x+1,t.step+1));
                visit[t.x+1]=1;
            }
            if(t.x*2<=maxn && !visit[t.x*2]){
                s.push(node(t.x*2,t.step+1));
                visit[t.x*2]=1;
            }
            s.pop();
        }
    }
    return 0;
}

下面是我自己实现的代码,注意判断时 要判断 2*n<100000 || n+1<100000 原因我相信你也懂,不然会runtime error

#include<iostream>  
#include<algorithm>  
#include<queue>
using namespace std; 

const int maxn=100006;

queue<int>q;

int m,k;
int visit[maxn];
int a[maxn];
  
void bfs(){
    int n=q.front();
    while(!q.empty()){
        n=q.front();
        if(n==k)
        return;
        q.pop();
        if(n!=0 && !visit[n-1]){
            q.push(n-1);
            visit[n-1]=1;
            a[n-1]=a[n]+1;
        }
        if(n+1<100001 && !visit[n+1]){
            q.push(n+1);
            visit[n+1]=1;
            a[n+1]=a[n]+1;
        }
        if((2*n)<maxn && !visit[2*n]){
            q.push(2*n);
            visit[2*n]=1;
            a[2*n]=a[n]+1;
        }
    }
}
 
int main(){
    cin>>m>>k;
    q.push(m);
    visit[m]=1;
    bfs();
    cout<<a[k];
    return 0;
}
柳暗花明又一村
原文地址:https://www.cnblogs.com/ucandoit/p/8546641.html