1. 程式人生 > >超超超簡單的bfs——POJ-3278

超超超簡單的bfs——POJ-3278

ber str ted stdio.h bsp front epo hint fast

Catch That Cow
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 89836 Accepted: 28175

Description

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K

≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.

* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.

If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

Input

Line 1: Two space-separated integers: N and K

Output

Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

Sample Input

5 17

Sample Output

4

Hint

The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes. 起點在n,終點是k,每一步可以是+1、-1或*2,最少走幾步?
 1
#include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 int a[200005];//一個2倍大小的數組代表可以走到的位置,因為有乘二所以要開二倍以防RE,a[i]=x --> 走到坐標i需要x步 6 int main() 7 { 8 int n, k, t; 9 queue<int>q; 10 scanf("%d%d", &n, &k); 11 memset(a, -1, sizeof(a));//所有坐標初始化為-1 12 a[n] = 0; //n走到n當然是需要步 13 q.push(n); //當前位點入隊 14 while (!q.empty()) 15 { 16 t = q.front(); //讀取隊首 17 q.pop(); //刪除隊首 18 if (t == k) //若到達終點則直接輸出並結束 19 { 20 printf("%d\n", a[k]); 21 return 0; 22 } 23 if (t - 1 >= 0 && a[t - 1] == -1)//可能到達的結點入隊,要判斷是否越界,走過的不再走 24 { 25 a[t - 1] = a[t] + 1; q.push(t - 1);//下一步走到的位點所需步數是當前位點的步數+1 26 } 27 if (t + 1 < 200001 && a[t + 1] == -1) 28 { 29 q.push(t + 1); a[t + 1] = a[t] + 1; 30 } 31 if (t * 2 < 200004 && a[t * 2] == -1) 32 { 33 q.push(t * 2); a[t * 2] = a[t] + 1; 34 } 35 } 36 }

簡單的bfs

超超超簡單的bfs——POJ-3278