http://www.lydsy.com/JudgeOnline/problem.php?id=1646
这一题开始想到的是dfs啊,,但是本机测样例都已经re了。。。
那么考虑bfs。。。很巧妙?
首先我们得确定一个上下界。
当到达距离<0时显然不可能再走了(准确来说绝对不会比当前优),所以这里可以剪枝。
当到达距离>max(n, k)+1时也不能再走了(准确说不会比之前的优,比如说,你走到了k+2,但是之前就可在某个小于k的地方走×2的就走到了,那么就比这个少了1步)所以这里可以剪枝
然后bfs。。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }
const int N=100005;
int n, k, front, tail, q[N], d[N], vis[N];
void add(int x) { if(vis[x]) return; vis[x]=1; q[tail++]=x; if(tail==N) tail=0; }
int main() {
read(n); read(k);
int mx=max(n, k)+1, t;
q[tail++]=n;
CC(d, 0x7f); d[n]=0;
while(front!=tail) {
t=q[front++]; if(front==N) front=0; vis[t]=0;
if(t==k) break;
int dt=d[t]+1;
if(t>0 && dt+1<d[t-1]) d[t-1]=dt, add(t-1);
if(t<mx && dt<d[t+1]) d[t+1]=dt, add(t+1);
if((t<<1)<=mx && dt<d[t<<1]) d[t<<1]=dt, add(t<<1);
}
print(d[k]);
return 0;
}
Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 <= N <= 100,000) on a number line and the cow is at a point K (0 <= K <= 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting. * Walking: FJ can move from any point X to the points X-1 or X+1 in a single minute * Teleporting: FJ can move from any point X to the point 2*X in a single minute. If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
* Line 1: Two space-separated integers: N and K
Output
* Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
Farmer John starts at point 5 and the fugitive cow is at point 17.
Sample Output
OUTPUT DETAILS:
The fastest way for Farmer John to reach the fugitive cow is to
move along the following path: 5-10-9-18-17, which takes 4 minutes.