Catch That Cow:
题目大意:(文末有原题)
在一条线上,给出两个位置,每一步有两种操作:
- x + 1 或 x - 1;
- x *= 2;
输出从第一个位置运动到第二个位置的最短距离
思路:
依旧是迷宫问题,不过是一条线上的迷宫问题(数轴),并要求输出最短的时间,三种运动方式的bfs;要注意考虑范围,剪枝;否则会TLE,并且要注意进行运动后的数据是否满足范围;
代码:
#include <iostream> #include <queue> #include <cstring> using namespace std; const int maxn = 1e5 + 6; int n, k, ans; //FJ的位置 和 牛的位置 和 答案 int vis[maxn + 100]; //标记数组 struct Node{ int x, step; Node(int x = 0, int step = 0) : x(x), step(step) {} }; void bfs(void) { queue<Node> q; q.push(Node(n, 0)); vis[n]++; while(!q.empty()) { Node now = q.front(); q.pop(); if(now.x == k) { ans = now.step; return; } //每次判定前都要注意判定后会不会出范围; if(now.x >= 1 && now.x - 1 <= maxn && !vis[now.x - 1] ) { vis[now.x - 1]++; q.push(Node(now.x - 1, now.step + 1)); } if( now.x + 1 <= maxn && now.x + 1 >= 0 && !vis[now.x + 1] ) { vis[now.x + 1]++; q.push(Node(now.x + 1, now.step + 1)); } if( 2 * now.x <= maxn && now.x * 2 >= 0 && !vis[2 * now.x] ) { vis[2 * now.x]++; q.push(Node(2 * now.x, now.step + 1)); } } return; } int main() { cin >> n >> k; memset(vis, 0, sizeof(vis)); bfs(); cout << ans << endl; return 0; }
题目:
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?
输入:
Line 1: Two space-separated integers: N and K
输出:
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
样例:
Input Output
5 17 ----------------- 4