【NOI】2971:抓住那頭牛/ 2.5基本演算法之搜尋
阿新 • • 發佈:2019-01-01
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; } }
這裡面都用的些簡單語句,我不說評論區的大佬們也看得懂,抓了三天牛,今天終於可以“大吉大利,今晚吃牛”了,昨天看老師上課現寫程式碼,改了幾遍就成了,唉,我還是一名萌新啊……