题意:在数轴上给出两个点n,k,n为起点,k为终点,有三种移动方向x+1、x-1、2*x,求出n到k的最少移动步数
链接:http://poj.org/problem?id=3278
思路:三方向广搜
注意点:无
以下为AC代码:
Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
13917555 | luminous11 | 3278 | Accepted | 1196K | 47MS | G++ | 1589B | 2015-02-27 22:18:30 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
int m, n;
struct node{
int ti;
int cnt;
node(){}
node( int _ti, int _cnt ) : ti(_ti), cnt(_cnt){}
};
bool vis[300005];
int bfs ( node tmp ){
queue<node> q;
q.push ( tmp );
while ( ! q.empty() ){
tmp = q.front(); q.pop();
if ( tmp.cnt == n )return tmp.ti;
if ( tmp.cnt+1 >= 0 && tmp.cnt+1 <= 100000 && vis[tmp.cnt+1] == 0 ){ q.push ( node ( tmp.ti + 1, tmp.cnt + 1 ) ); vis[tmp.cnt+1] = 1; }
if ( tmp.cnt-1 >= 0 && tmp.cnt-1 <= 100000 && vis[tmp.cnt-1] == 0 ){ q.push ( node ( tmp.ti + 1, tmp.cnt - 1 ) ); vis[tmp.cnt-1] = 1; }
if ( tmp.cnt*2 >= 0 && tmp.cnt*2 <= 100000 && vis[tmp.cnt*2] == 0 ){ q.push ( node ( tmp.ti + 1, tmp.cnt * 2 ) ); vis[tmp.cnt*2] = 1; }
}
}
int main()
{
ios::sync_with_stdio( false );
while ( cin >> m >> n ){
clr ( vis, 0 );
cout << bfs ( node( 0, m ) ) << endl;
}
return 0;
}