poj 3278 Catch That Cow(bfs)

1221 ワード

テーマリンク:
http://poj.org/problem?id=3278
人の位置と牛の位置を教えます.三つの方法で移動できます.
左に1ステップ移動するか、右に1ステップ移動するか、または現在位置の2倍の位置に移動します.
牛のところには何回移動しますか?
最初はbfsを使うとは思いませんでしたが、やっぱりtoo naiveです.
ACコード:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
#define MAX 100005
int vis[MAX],n,k;
queue<int>q;
int step[MAX];
int head,next;
int bfs()
{
    q.push(n);
    step[n]=0;
    vis[n]=1;
    while(!q.empty())
    {
        head=q.front();
        q.pop();
        for(int i=0;i<3;i++)
        {
            if(i==0) next=head-1;
            else if(i==1) next=head+1;
            else next=head*2;
            if(next>MAX || next<0) continue;
            if(vis[next]==0)
            {
                q.push(next);
                step[next]=step[head]+1;
                vis[next]=1;
            }
             if(next==k)  return step[next];
        }
    }
    return -1;
}
int main()
{
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&k);
    if(n>k)
        printf("%d
",n-k); else{ printf("%d
",bfs()); } }