• 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;
    }
    柳暗花明又一村
  • 相关阅读:
    系统开机自动运行程序和自动启动服务
    Show/hide mouse cursor
    Trap mouse events outside of my application
    Delphi防止同时出现多个应用程序实例CreateMutex
    用Delphi实现抓屏
    .NET四种注释规范
    再谈C#里4个访问权限修饰符
    什么是组件以及为什么使用组件
    做项目的时候千万不能懒!
    范式篇之一范式理论
  • 原文地址:https://www.cnblogs.com/ucandoit/p/8546641.html
Copyright © 2020-2023  润新知