【题目链接】
http://poj.org/problem?id=3278
题目意思
你的牛跑了,现在你要去追牛,给你你的坐标n,牛的坐标k。你可以向前移动一步或后退一步,或者两倍(x*2)的走。问你最少走多少步追到牛?你不动。
解题思路
用步数来深搜,有点坑的是下限为0,上限为1e5,之前没判断上限一直wa 0.0,
代码部分
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3
const int N = 1e5+5;
int vis[N];
struct node
{
int s,n;
}s;
int n, m;
int bfs()
{
queue<node> q;
vis[s.n] = 1;
q.push(s);
while (!q.empty())
{
node t = q.front();
q.pop();
node k;
k.s = t.s+1;
///三种走法
k.n = t.n+1;
if (k.n >= 0 &&k.n <= 100000 && !vis[k.n])
{
if (k.n == m)
return k.s;
vis[k.n]=1;
q.push(k);
}
k.n = t.n-1;
if (k.n >= 0 &&k.n <= 100000 && !vis[k.n])
{
if (k.n == m)
return k.s;
vis[k.n]=1;
q.push(k);
}
k.n = t.n*2;
if (k.n >= 0 &&k.n <= 100000 && !vis[k.n])
{
if (k.n == m)
return k.s;
vis[k.n]=1;
q.push(k);
}
}
return -1;
}
int main()
{
while (~scanf("%d %d",&n,&m))
{
memset(vis,0,sizeof(vis));
s.s=0;
s.n=n;
if (n >= m) ///大于时候只能一步步往后退
printf("%d\n",n-m);
else
printf("%d\n",bfs());
}
return 0;
}