A very simple, typical BFs.
Code abuse me a thousand times, waiting for code to be like first love
Catch that cow
| Time limit:2000 ms |
|
Memory limit:65536 K |
| Total submissions:47366 |
|
Accepted:14869 |
Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a pointN(0 ≤N≤ 100,000) on a number line and the cow is at a pointK(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 pointXTo the pointsX-1 orX+ 1 in a single minute
* Teleporting: FJ can move from any pointXTo the point 2 ×XIn 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:
NAnd
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.
Source
Usaco 2007 Open silver
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <ctype.h>#include <limits.h>#include <string.h>#include <string>#include <math.h>#include <algorithm>#include <iostream>#include <queue>#include <stack>#include <vector>#include <set>#include <map>#include <deque>using namespace std;#define MAXN 100000 + 10int vis[MAXN];int k;struct node{ int num; int sum; //int vis;}a[MAXN];void BFS(int n){ queue<node>q; node front; node rear; front.num = n; vis[n] = 1; front.sum = 0; q.push(front); int mark1; int mark2; int mark3; //int mark4; //int sum = 0; while(!q.empty()){ front = q.front(); q.pop(); if(front.num == k){ printf("%d\n",front.sum); break; } mark1 = front.num - 1; mark2 = front.num + 1; mark3 = front.num*2; if(mark1>=0 && vis[mark1]==0){ rear.num = mark1; rear.sum = front.sum+1; //sum++; vis[mark1] = 1; q.push(rear); } if(mark2<=100000 && vis[mark2]==0){ rear.num = mark2; //sum++; rear.sum = front.sum + 1; vis[mark2] = 1; q.push(rear); } if(mark3<=100000 && vis[mark3]==0){ rear.num = mark3; //sum++; rear.sum = front.sum + 1; vis[mark3] = 1; q.push(rear); } }}int main(){ int n; while(~scanf("%d%d",&n,&k)){ memset(vis,0,sizeof(vis)); //memset(a,0,sizeof(a)); BFS(n); } return 0;}
Bfs pk u 3278