bfs-poj3278

题目链接:http://poj.org/problem?id=3278

题意:农夫原始在N位置上,他的目的是要抓到在K位置上的牛。牛的位置是固定不变的,而农夫的移动是在一条水平线上进行的,移动方式有以下三种1、从当前位置往后移动一格;2、从当前位置往前移动一格;3、从当前位置pos瞬移到2*pos位置上。

刚开始我想利用DP来解决这道题,但是以失败告终,所以便参考了别人的解法,发现大多数人都是使用bfs来解决的。于是我改用bfs来处理。

代码实现:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=100001;//此处范围得准确,如果小了会Wrong

int vis[maxn],step[maxn];
queue<int>que;

int bfs(int N,int K)
{
    int next,top;
    que.push(N);//农夫所在初始点入队
    vis[N]=true;//标记已被访问
    step[N]=0;//步数初始为0
    while(!que.empty()){//队列非空时,执行循环
        top=que.front();//取出队首
        que.pop();//弹出队首
        for(int i=0;i<3;i++){
            if(i==0) next=top-1;
            else if(i==1) next=top+1;
            else next=top*2;
            if(next<0||next>=maxn) continue;//如已出界,则排除该情况
            if(!vis[next]){//如果改点还未被访问过
                que.push(next);//入队
                step[next]=step[top]+1;//步数+1
                vis[next]=true;//标记已被访问过
            }
            if(next==K) return step[next];//当遍历到结果,返回步数
        }
    }
}
int main()
{
    int N,K;
    while(~scanf("%d%d",&N,&K)){
        memset(step,0,sizeof(step));
        memset(vis,false,sizeof(vis));
        while(!que.empty()) que.pop();//注意调用前要先清空
        if(N>=K) printf("%d\n",N-K);
        else printf("%d\n",bfs(N,K));
    }
    return 0;
}

 

posted @ 2018-11-18 10:54  里昂静  阅读(193)  评论(0编辑  收藏  举报