1646: [Usaco2007 Open]Catch That Cow 抓住那只牛
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1223 Solved: 583
[ Submit][ Status][ Discuss]
Description
农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上幽发,尽快把那只奶牛抓回来.
他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有
两种办法移动,步行和瞬移:步行每秒种可以让约翰从z处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.
那么,约翰需要多少时间抓住那只牛呢?
Input
* Line 1: Two space-separated integers: N and K
仅有两个整数N和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
搜索入门经典题
其实就是暴力
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef struct
{
int x;
int time;
}state;
state now, temp;
queue<state> q;
int flag[150005];
int main(void)
{
int n, m;
while(scanf("%d%d", &n, &m)!=EOF)
{
if(n>=m)
{
printf("%d\n", n-m);
continue;
}
memset(flag, 0, sizeof(flag));
now.x = n, now.time = 0;
q.push(now);
flag[n] = 1;
while(q.empty()==0)
{
now = q.front();
q.pop();
if(now.x==m)
{
while(q.empty()==0)
q.pop();
break;
}
if(now.x*2<=150000 && flag[now.x*2]==0)
{
temp.x = now.x*2;
temp.time = now.time+1;
flag[temp.x] = 1;
q.push(temp);
}
if(now.x-1>0 && flag[now.x-1]==0)
{
temp.x = now.x-1;
temp.time = now.time+1;
flag[temp.x] = 1;
q.push(temp);
}
if(now.x+1<=100000 && flag[now.x+1]==0)
{
temp.x = now.x+1;
temp.time = now.time+1;
flag[temp.x] = 1;
q.push(temp);
}
}
printf("%d\n", now.time);
}
return 0;
}