poj 3278 Catch That Cow(bfs)
テーマリンク:
http://poj.org/problem?id=3278
人の位置と牛の位置を教えます.三つの方法で移動できます.
左に1ステップ移動するか、右に1ステップ移動するか、または現在位置の2倍の位置に移動します.
牛のところには何回移動しますか?
最初はbfsを使うとは思いませんでしたが、やっぱりtoo naiveです.
ACコード:
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());
}
}