您的位置:首页 > 其它

XDOJ1012--奇妙的旅行

2014-08-17 16:27 246 查看
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

解题思路:
这道题有动态规划的特点,设L(n)表示从A到n所需要的最小步数,则
L(m) = min{ L(m-1), L(m+1), L(m/2) }
但是在实际上我没能成功用其编程,最终还是用了网上的BFS实现程序。
从A开始广度搜索,最先找到B的层就是所需要的最少步数
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int val,step;
};
int S,T;
const int L = 130000;
bool s[130000];
int bfs()
{
for(int i=0;i<L;++i)
s[i] = false;
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<L)
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)<L)
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 (cin>>S>>T)
{
if (S>T)
{
cout<<S-T<<endl;
continue;
}
int ans=bfs();
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: