poj 3278 Catch That Cow bfs

2802 ワード

Catch That Cow
Time Limit: 2000MS
 
Memory Limit: 65536K
Total Submissions: 70246
 
Accepted: 22095
Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute * Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers:
N and
K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17

Sample Output
4

Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
Source
USACO 2007 Open Silver
各状態を一度捜す
特審を覚えている
ACcode:
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 100100
using namespace std;
int n,k;
struct Node{
    int x;
    int t;
};
bool vis[maxn];
Node my,now,s1,s2,s3;
bool judge(Node x){
    if(x.x<0||x.x>100000||vis[x.x])return false;
    return true;
}
void bfs(){
    if(n>=k){
        printf("%d
",n-k); return; } queue<Node>q; memset(vis,0,sizeof(vis)); my.x=n; my.t=0; q.push(my); vis[n]=1; while(!q.empty()){ now=q.front();q.pop(); s1=now;s1.t++;s1.x+=1; if(judge(s1)){ if(s1.x==k){ printf("%d
",s1.t); return; }else { vis[s1.x]=1; q.push(s1); } } s2=now;s2.t++;s2.x-=1; if(judge(s2)){ if(s2.x==k){ printf("%d
",s2.t); return; }else { vis[s2.x]=1; q.push(s2); } } s3=now;s3.t++;s3.x*=2; if(judge(s3)){ if(s3.x==k){ printf("%d
",s3.t); return; }else { vis[s3.x]=1; q.push(s3); } } } } int main(){ while(~scanf("%d%d",&n,&k))bfs(); return 0; }