1. 程式人生 > >【NOI】2971:抓住那頭牛/ 2.5基本演算法之搜尋

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

這裡面都用的些簡單語句,我不說評論區的大佬們也看得懂,抓了三天牛,今天終於可以“大吉大利,今晚吃牛”了,昨天看老師上課現寫程式碼,改了幾遍就成了,唉,我還是一名萌新啊……