题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717
思路挺简单的,莫名其妙一直敲不对。。全删了重新敲一遍就过了……
看网上一般有两种做法,一种是用struct存位置和步数,感觉复杂了点。直接用vis数组存步数的话,既可以标记是否走过这个状态,也可以记录步数。
/*
* @Author: Samson
* @Date: 2018-04-24 14:33:18
* @Last Modified by: Samson
* @Last Modified time: 2018-04-24 17:19:05
*/
// @URL : http://acm.hdu.edu.cn/showproblem.php?pid=2717
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include <cstdlib>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e6+10;
int n,k,vis[MAXN],dir[] = {-1,1,0};
void bfs()
{
memset(vis,0,sizeof vis);
queue<int> que;
int cur,next;
cur = n;
vis[cur] = 0;
que.push(cur);
while(que.size())
{
cur = que.front();
que.pop();
dir[2] = cur; //第三种,*2的转换成+cur
for(int i = 0; i < 3; ++i)
{
next = cur+dir[i];
if(next<0 || next>MAXN)
continue;
if(!vis[next])
{
vis[next] = vis[cur]+1;
que.push(next);
}
if(next == k)
{
cout<<vis[next]<<'\n';
return;
}
}
}
}
int main(void)
{
while(cin>>n>>k)
{
if(n == k)
cout<<0<<'\n';
else if(n>k)
cout<<n-k<<'\n';
else
bfs();
}
}