POJ 3278 BFS + queue

时间:2022-07-24
本文章向大家介绍POJ 3278 BFS + queue,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上,农夫起始位于点N(0<=N<=100000) ,牛位于点K(0<=K<=100000) 。农夫有两种移动方式: 1、从X移动到X-1或X+1 ,每次移动花费一分钟; 2、从X移动到2*X ,每次移动花费一分钟; 假设牛没有意识到农夫的行动,站在原地不动。最少要花多少时间才能抓住牛? Input 一行:以空格分隔的两个字母: N和 K Output 一行: 农夫抓住牛需要的最少时间。 Sample Input 5 17 Sample Output 4 Hint 农夫使用最短时间抓住牛的方案如下: 5-10-9-18-17, 需要4分钟.

#include<bits/stdc++.h>
using namespace std;
#define N 100010
int step[N],vis[N];
queue<int>q;
int bfs(int n,int k){
    int now,next;
    step[n]=0;
    vis[n]=1;
    q.push(n);
    while(!q.empty()){
        now=q.front();
        q.pop();
        for(int i=0;i<3;i++){
            if(i==0) next=now-1;
            else if(i==1) next=now+1;
            else if(i==2) next=now*2;
            if(next<0||next>N) continue;
            if(!vis[next]){
                vis[next]=1;
                q.push(next);
                step[next]=step[now]+1; 
            }
            if(next==k) return step[next];
        }
    }
}
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    if(n>=k) printf("%dn",n-k);  
    else printf("%dn",bfs(n,k));
    return 0;
}