//@author: yzj Date:2015/07/26
//sourse : http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82603#problem/A
//meaning: 農夫追牛,農夫每次可以走2*x, x-1 或 x+1三種方式,求最小時間
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN = 100000+5;
int n, k;
bool vis[MAXN];
int step[MAXN];
queue<int> que;
int bfs(int pos)
{
que.push(pos);
vis[pos] = true;
step[pos] = 0;
while(!que.empty())
{
int head, next;
head = que.front();
que.pop();
for(int i = 0; i < 3; i++)//枚舉三種方法
{
if(i == 0)
{
next = head * 2;
}
else if(i == 1)
{
next = head + 1;
}
else
{
next = head - 1;
}
//超出界限, 跳過
if(next < 0 || next > MAXN || vis[next]) continue;
else
{
que.push(next);
step[next] = step[head] + 1;
vis[next] = true;
}
//廣搜的特性,返回的第一個一定是最短的路徑
if(next == k) return step[next];
}
}
}
int main()
{
//freopen("f:/yzj/cppCode/input.txt", "r", stdin);
scanf("%d %d", &n, &k);
if(n >= k) printf("%d\n", n-k);
else printf("%d\n", bfs(n));
return 0;
}
A - 廣搜 基礎
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.