POJ 3278: Catch That Cow
题意:农夫在n号点,牛在k号点,农夫每次可以左右移动一格或者跳到2x位置,求农夫最少移动几次抓到牛。
分析:显然,如果n>=k,step=n-k。对于n<k的情况,对三个方向广搜即可。(没事水母牛题可还行)
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int n,k,step[100005]; bool vis[100005]; queue<int>q; void init(){ cin>>n>>k; } int bfs(int n,int k){ q.push(n); vis[n]=true; while(!q.empty()){ int head=q.front(),next; q.pop(); range(i,0,2){ if(!i)next=head-1; else if(i==1)next=head+1; else next=head<<1; if(next>100005||next<0)continue; if(!vis[next]){ q.push(next); step[next]=step[head]+1; vis[next]=true; } if(next==k)return step[next]; } } } void solve(){ cout<<(n>=k?n-k:bfs(n,k))<<endl; } int main() { init(); solve(); return 0; }