2971:抓住那头牛
总时间限制:
2000ms
内存限制:
65536kB
描述
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
5 17样例输出
4
这道题我做了3天,最后1天早上就好了,结果手滑多打了个“=”,又弄了一天,好不容易 Accepted 了,这次是我和我爸一起做的,终于没有求助于终极大佬。。。我终于知道没学queue函数多糟糕,只好看人家用queue函数行云流水,ε=(´ο`*)))唉……最后还是一对父子俩互相帮助才过了,毕竟才把宽搜搞明白了点啊,开始我用dfs,结果直接完蛋,后来终于学了bfs……不说了,这是我的血汗源代码:
#include<bits/stdc++.h>
using namespace std;
int front,rear,n,k,q[100010][2];
int number_axis[100010]={0};
void bfs();
int main()
{
cin>>n>>k;
front=0,rear=1; //front<-0 rear<-1
q[rear][0]=n,q[rear][1]=0; //初始状态入队
number_axis[n]=1;
bfs();
cout<<q[rear][1];
return 0;
}
void bfs()
{
if(q[rear][0]>=k)
{
rear++;
q[rear][1]=q[rear-1][0]-k;
return;
}
bool first=1;
while(front<rear) //必须的
{
front++; //取队首元素进行发展
int d[3]={-1,1,q[front][0]}; //为了应付"*2",只好这样了
for(int i=0;i<3;i++) //对所有可能的拓展状态
{
int temp=q[front][0]+d[i];
if(temp>=0&&temp<=100000&&number_axis[temp]==0)
{ //如果新状态合法,入队
rear++;
number_axis[temp]=1;
q[rear][0]=temp;
q[rear][1]=q[rear-1][1];
if(first){q[rear][1]=q[front][1]+1;first=0;}
if(q[rear][0]==k) //如果当前状态是目标状态,bfs结束
return;
}
}
first=1;
}
}
这里面都用的些简单语句,我不说评论区的大佬们也看得懂,抓了三天牛,今天终于可以“大吉大利,今晚吃牛”了,昨天看老师上课现写代码,改了几遍就成了,唉,我还是一名萌新啊……