您的位置:首页 > 其它

奇妙的旅行[XDU1012]

2013-08-16 18:03 225 查看
Problem 1012 - 奇妙的旅行
Time Limit: 1000MS Memory Limit: 65536KB Difficulty:
Total Submit: 396 Accepted: 116 Special Judge: No

Description

  炸鸡儿非常喜欢旅行,而且喜欢在坐标轴上旅行,从起点A到终点B(0<=A,B<=100000)。他旅行的方法很特殊,喜欢用跳的,每次跳一个地方只有三种方法:
从点C跳到点C+1。
从点C跳到点C-1。
从点C跳到点2*C。
请问他从A跳到B至少需要多少步?

Input
每组数据两个整数A,B(0<=A,B<=100000)。
Output
每例输出一行,表示至少需要的步数。
Sample Input
1 100000
0 100000
Sample Output
21
22
Hint

Source
Wang Miao
不知为什么,最近特喜欢做这样的水水的bfs.

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
int val,step;
};
int S,T;
bool s[200010];
int bfs()
{
memset(s,false,sizeof(s));
queue<node> q;
while (!q.empty()) q.pop();
node st;
st.val=S;
st.step=0;
q.push(st);
s[S]=true;
while (!q.empty())
{
node st=q.front();
q.pop();
if (st.val==T) return st.step;
if (st.val+1<=T*2)
if (!s[st.val+1])
{
s[st.val+1]=true;
node tmp=st;
tmp.step++;
tmp.val=st.val+1;
q.push(tmp);
}
if (st.val-1>0)
if (!s[st.val-1])
{
s[st.val-1]=true;
node tmp=st;
tmp.step++;
tmp.val=st.val-1;
q.push(tmp);
}
if ((st.val<<1)<=T*2)
if (!s[st.val<<1])
{
s[st.val<<1]=true;
node tmp=st;
tmp.step++;
tmp.val=st.val<<1;
q.push(tmp);
}
}
}
int main()
{
while (scanf("%d%d",&S,&T)!=EOF)
{
if (S>T)
{
printf("%d\n",S-T);
continue;
}
int ans=bfs();
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: