Think: BFS +队列 题目, 农夫有两种种不同的移动方式
PRoblem 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. Example Input
5 17
Example Output
4
题目大意: 1. 数轴上有A B2点 2. 农夫 有两种移动方式:walk 每分钟移动一格 Teleporting 每次移动 2*i个单位 3.求最短时间
#include<bits/stdc++.h> using namespace std; bool v[1000005]; int step[1000005]; void BFS(int n, int k); queue<int>q; int main() { int n, k; while(cin >> n >> k) { while(!q.empty()) q.pop(); memset(v, 0, sizeof(v)); if (n >= k) cout << n - k << endl; else BFS(n, k); } return 0; } void BFS(int n, int k) { int head, next, i; q.push(n); step[n] = 0; while(!q.empty()) { head = q.front(); q.pop(); for (i = 0;i < 3;i ++) { if (i == 0) next = head + 1; if (i == 1) next = head - 1; if (i == 2) next = head * 2; if (next < 0 || next > 100000) continue ; if (v[next] == 0) { q.push(next); step[next] = step[head] + 1; v[next] = 1; } if (next == k) { cout << step[next] << endl; return ; } } } }/***************************************************User name: Result: AcceptedTake time: 0msTake Memory: 468KBSubmit time: 2017-02-18 19:26:43****************************************************/新闻热点
疑难解答