超超超简单的bfs——POJ-3278
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