2017年3月23日 | ljfcnyali题目大意
FJ要抓奶牛。
开始输入N(FJ的位置)K(奶牛的位置)。
FJ有三种移动方法:
1、向前走一步,耗时一分钟。
2、向后走一步,耗时一分钟。
3、向前移动到当前位置的两倍N*2,耗时一分钟。
问FJ抓到奶牛的最少时间。PS:奶牛是不会动的。
Sample Input
5 17
1
5 17
Sample Output
4
1
4
题目分析
BFS乱搞,其实这到题目很简单的,就是一个队列3个方向,毫无意义!
AC代码
/*************************************************************************
> File Name: POJ3278.cpp
> Author: ljf-cnyali
> Mail: ljfcnyali@gmail.com
> Created Time: 2017-03-22 20:54:25
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
using namespace std;
#define REP(i, a, b) for(int i = (a), _end_ = (b);i <= _end_; ++ i)
#define mem(a) memset((a), 0, sizeof(a))
#define str(a) strlen(a)
const int maxn = 100010;
int n, m;
struct node {
int sum, now;
}p1, p2;
int v[maxn * 2];
int BFS() {
queue<node> Q;
p1.sum = 0, p1.now = n;
Q.push(p1);
while(!Q.empty()) {
p1 = Q.front();
Q.pop();
if(p1.now == m)
return p1.sum;
if(p1.now <= m && !v[p1.now * 2]) {
p2.now = p1.now * 2;
p2.sum = p1.sum + 1;
Q.push(p2);
v[p2.now] = 1;
}
if(p1.now <= m && !v[p1.now + 1]) {
p2.now = p1.now + 1;
p2.sum = p1.sum + 1;
Q.push(p2);
v[p2.now] = 1;
}
if(p1.now - 1 >= 0 && !v[p1.now - 1]) {
p2.now = p1.now - 1;
p2.sum = p1.sum + 1;
Q.push(p2);
v[p2.now] = 1;
}
}
return -1;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scanf("%d%d", &n, &m);
if(n >= m)
printf("%d\n", n - m);
else
printf("%d\n", BFS());
return 0;
}