【NOI】2971:抓住那头牛/ 2.5基本算法之搜索

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;
	}
}

这里面都用的些简单语句,我不说评论区的大佬们也看得懂,抓了三天牛,今天终于可以“大吉大利,今晚吃牛”了,昨天看老师上课现写代码,改了几遍就成了,唉,我还是一名萌新啊……

猜你喜欢

转载自blog.csdn.net/u011735418/article/details/85492517