4001:抓住那頭牛,考點:廣搜範圍
阿新 • • 發佈:2021-07-13
原題:http://bailian.openjudge.cn/practice/4001/
描述
農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點N(0<=N<=100000),牛位於點K(0<=K<=100000)。農夫有兩種移動方式:
1、從X移動到X-1或X+1,每次移動花費一分鐘 2、從X移動到2*X,每次移動花費一分鐘 假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要花多少時間才能抓住牛?輸入
兩個整數,N和K
輸出
一個整數,農夫抓到牛所要花費的最小分鐘數
樣例輸入
5 17
樣例輸出
4
解法
思路:廣搜,用佇列實現。但這道題有兩個額外要注意的點,第一個是要記得去重,無後效性,不要讓重複的點進入佇列。第二個是注意數軸的範圍,超過範圍的不入佇列。
1 #include <iostream> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 struct point { 6 int place; 7 int minute; 8 point(int x,int y):place(x),minute(y){} 9 }; 10 bool visited[100005]; 11 int main() 12 { 13 memset(visited, 0, sizeof(visited)); 14int N, K; 15 cin >> N >> K; 16 queue<point>myqueue; 17 myqueue.push(point(N,0)); 18 while (!myqueue.empty()) { 19 point top = myqueue.front(); 20 myqueue.pop(); 21 if (top.place == K) { 22 cout << top.minute << endl;23 break; 24 } 25 visited[top.place] = 1; 26 //注意搜尋的範圍 27 if(top.place - 1 >= 0&&!visited[top.place-1]) 28 myqueue.push(point(top.place - 1, top.minute + 1)); 29 if(top.place+1<=100000&&!visited[top.place+1]) 30 myqueue.push(point(top.place + 1, top.minute + 1)); 31 if(top.place * 2 <= 100000&&!visited[top.place*2]) 32 myqueue.push(point(top.place * 2, top.minute + 1)); 33 } 34 return 0; 35 }