1. 程式人生 > 其它 >4001:抓住那頭牛,考點:廣搜範圍

4001:抓住那頭牛,考點:廣搜範圍

原題: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));
14
int 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 }