void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个牛的坐标n,然后他可以前走一步或者倒退一步,或者直接走到2*n的位置上

直接想到的就是bfs,用一个数列来模拟,先找当前一步能到的地方,放到数组里,之后一层一层找

#include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
#include <algorithm>
#define N 100001
using namespace std;
int dis[N];
bool used[N];
queue<int>Q;
int init(int n,int k)
{
    while(Q.size())
    Q.pop();
    memset(dis,0,sizeof(dis));
    memset(used,false,sizeof(used));
    int ans;
    Q.push(n);
    dis[n]=0;
    used[n]=true;
    while(Q.size())
    {
        ans=Q.front();
        Q.pop();
        if(ans-1>=0&&!used[ans-1])
        {
            dis[ans-1]=dis[ans]+1;
            used[ans-1]=true;
            Q.push(ans-1);
        }
        if(ans+1<N&&!used[ans+1])
        {
            dis[ans+1]=dis[ans]+1;
            used[ans+1]=true;
            Q.push(ans+1);
        }
        if(ans*2<N&&!used[ans*2])
        {
            dis[ans*2]=dis[ans]+1;
            used[ans*2]=true;
            Q.push(ans*2);
        }
        if(used[k])break;
    }
    return dis[k];
}

int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    printf("%d\n",init(n,k));
    
}
posted on 2011-05-09 21:52  void-man  阅读(159)  评论(0)    收藏  举报