1253:抓住那头牛
时间限制: 1000 ms 内存限制: 65536 KB
提交数:32800 通过数: 13223
【题目描述】
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000)�(0≤�≤100000),牛位于点K(0≤K≤100000)�(0≤�≤100000)。农夫有两种移动方式:
1、从X�移动到X−1�−1或X+1�+1,每次移动花费一分钟
2、从X移动到2×X2×�,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
【输入】
两个整数,N�和K�。
【输出】
一个整数,农夫抓到牛所要花费的最小分钟数。
【输入样例】
5 17
【输出样例】
4
样例代码?(1):
#include<bits/stdc++.h>
using namespace std;
int a[100005];//数轴
int vis[100005];//标记
int n,k;//农夫和牛所在的位置
int head,tail;//队列的队首和队尾
struct node{
int x,step;
}que[100005];//创建队列
void bfs(int nx,int cnt1){
if(nx>=0&&nx<=100000&&vis[nx]==0){
vis[nx]=1;
que[tail].x=nx;
que[tail].step=cnt1;
tail++;
}
}
int main(){
cin>>n>>k;
head=tail=1;
que[head].x=n;//农夫作为起点
vis[n]=1;//给起点打标记
tail++;//队尾+1
que[head].step=0;//初始步数为0
while(head<tail){
int fx=que[head].x;//变化坐标
int cnt=que[head].step;//变化步数
if(fx==k){//抓住牛
cout<<cnt<<endl;
return 0;
}
bfs(fx-1,cnt+1);//三种移动方式
bfs(fx+1,cnt+1);
bfs(fx*2,cnt+1);
head++;
}
return 0;
}
(2):
#include<iostream>
using namespace std;
int q[1000005][2],tail=1,front=1;
bool f[1000005];
void print(){
cout <<"距离:";
for(int i=1;i<tail;i++){
printf("%2d ",q[i][0]);
}
cout << endl;
cout <<"步数:";
for(int i=1;i<tail;i++){
printf("%2d ",q[i][1]);
}
cout <<endl<<endl;
}
int main() {
int n,k;
cin>>n>>k;
q[tail][0]=n;
q[tail][1]=0;
tail++;
f[n] = 1;
while(front != tail) {
int x = q[front][0];
if(x==k) {
cout <<q[front][1];
return 0;
}
// 3种走法
for(int i=1; i<=3; i++) {
int y;
if(i==1) y = x+1;
else if(i==2) y = x-1;
else if(i==3) y = x*2;
//
if(y>k+10 || y<0 || f[y]) continue;
f[y] = 1;
q[tail][0] = y;
q[tail][1] = q[front][1] + 1;
tail++;
// print();
}
front++;
}
return 0;
}