http://poj.org/problem?id=3278
就是农场主在X轴上找牛,给定牛的坐标,扭不动,农场主可以 +1 -1 *2 的方式前进,求最少的步数使其找到牛。
分三种情况走,直到遇到牛即可,同时为了避免不断的重复于某一点,记录到达该点的最短距离。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #define maxn 100007 #define inf 9999999 using namespace std; int ans,s,e; struct node { int len; int pos; }p[maxn];//用来记录到达该点的最短距离 //判断是否出界 bool isok(int x) { if (x >= 0 && x <= 100000) return true; else return false; } int bfs() { int i; int sum = 0; node ss; ss.len = 0; ss.pos = s; p[s].len = 1; queue<node>q; q.push(ss); while (!q.empty()) { node cur = q.front(); q.pop(); if (cur.pos == e) { sum = cur.len; break; } node t; for (i = 0; i < 3; ++i) { if (i == 0 && isok(cur.pos + 1)) { t.pos = cur.pos + 1; if (p[t.pos].len > cur.len + 1) { t.len = cur.len + 1; p[t.pos].len = cur.len + 1; q.push(t); } } if (i == 1 && isok(cur.pos - 1)) { t.pos = cur.pos - 1; if (p[t.pos].len > cur.len + 1) { t.len = cur.len + 1; p[t.pos].len = cur.len + 1; q.push(t); } } if (i == 1 && isok(cur.pos*2)) { t.pos = cur.pos*2; if (p[t.pos].len > cur.len + 1) { t.len = cur.len + 1; p[t.pos].len = cur.len + 1; q.push(t); } } } } return sum; } int main() { for (int i = 0; i <= 100000; ++i) p[i].len = inf; scanf("%d%d",&s,&e); int ans = bfs(); printf("%d\n",ans); return 0; }