1100. 抓住那头牛

// 1100. 抓住那头牛.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <queue>
#include <map>

using namespace std;

/*
https://www.acwing.com/problem/content/1102/

农夫知道一头牛的位置,想要抓住它。

农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。

农夫有两种移动方式:

从 X 移动到 X−1 或 X+1,每次移动花费一分钟
从 X 移动到 2∗X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。

农夫最少要花多少时间才能抓住牛?

输入格式
共一行,包含两个整数N和K。

输出格式
输出一个整数,表示抓到牛所花费的最少时间。

数据范围
0≤N,K≤105
输入样例:
5 17
输出样例:
4
*/


int n, k;


int main()
{
	cin >> n >> k;

	queue<int> q;
	q.push(n);
	map<int, int> mm; mm[n] = 1;
	while (!q.empty()) {
		int curr = q.front(); q.pop();
		int step = mm[curr];

		if (curr == k) {
			cout << step << endl; return 0;
		}

		int a = curr * 2;
		int b = curr - 1;
		int c = curr + 1;
		if (a < 2 * k && mm.count(a)==0) {
			q.push(a); mm[a] = step + 1;;
		}
		if (b >= 0 && mm.count(b) == 0) {
			q.push(b); mm[b] = step + 1;;
		}
		if (c >= 0 && c < 2 * k && mm.count(c) == 0) {
			q.push(c); mm[c] = step + 1;;
		}
	}
}

posted on 2024-07-15 10:12  itdef  阅读(11)  评论(0编辑  收藏  举报

导航