Problem 1012 - 奇妙的旅行
Time Limit
: 1000MS
Memory Limit
: 65536KB
Difficulty
:
Total Submit : 396 Accepted : 116 Special Judge : No
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
0 100000
Sample Output
21
22
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 ; }