poj 3278 Catch That Cow(BFS)

*题意:

     相当于在一个数轴上给定农夫的位置n与牛的位置k。假定牛不懂,农夫每次有三种移动方式:n+1.n-1.n*2。问农夫最少移动几步后才能到牛的位置。
*思路:
     用bfs寻找最短路径。
*代码:
#include<iostream>
#include<cstdio>
#include<cstring>
int queue[100001];
bool visit[100001];
int step[100001];
using namespace std;
void bfs(int n,int k)
{
    memset(visit,0,sizeof(visit));
    memset(step,0,sizeof(step));
    int i,next,temp,flag=0;
    int front=0,back=1;
    visit[n]=1,queue[0]=n;
    step[n]=0;
    while(front<back)
    {
        temp=queue[front++];
        for(i=0;i<3;i++)
        {
            if(i==0)next=temp+1;
            else if(i==1)next=temp-1;
            else next=temp*2;
            if(next<=100000&&next>=0&&!visit[next])//保证数组不越界,注意判断顺序,若!visit[next]在前会越界。
            {
                visit[next]=1;
                queue[back++]=next;
                step[next]=step[temp]+1;
            }
            if(next==k)
            {
                flag=1;
                break;
            }
        }
        if(flag)
            break;

    }
    cout<<step[k]<<endl;
}
int main()
{
    int n,k;
    cin>>n>>k;
    if(n>=k)
        cout<<n-k<<endl;
    else
        bfs(n,k);
    return 0;
}
注:1、这道题是第一次看bfs,看过之后感觉虽然题很简单但是对理解bfs的运行过程还是比较有帮助的。
    2、做这道提示注意不要让数组越界,所以有判断语句并且要注意次序(就是因为这个re了好多次)。

  

posted @ 2013-08-23 19:01  Neptunes  阅读(181)  评论(0编辑  收藏  举报