嗯弱弱的开始了BFS的旅程,不知从哪里找到了那个做题顺序。于是就按着那个来了。
题目描述:
嗯这个题目是给你两个数,一个是农夫的坐标n,一个是奶牛的坐标k,坐标轴大小在0到100000之间,然后农夫有三种行进的方法,分别是n+1 , n-1 , 2*n,然后我们就要求的是农夫追上奶牛所用的最短的步数嗯。
算法思想:
来,都告诉你是BFS了,那就来实现吧。
大意就是先把农夫位置n推进队列,然后因为队列是先进先出嘛,所以就在每一层都把三种操作做一遍看能不能达到最终的状态。如果不能的话再开到下一层。因为是最简单的BFS所以在这里也不多赘述了。
代码部分:
#include <iostream> #include <queue> #include <string.h> using namespace std; bool vis[101117]; int n, k; int main() { queue <int> q; cin >> n >> k; memset(vis, 0, sizeof(vis)); bool flag = false; int steps = 0; vis[n] = 1; q.push(n); if (n != k) { while (!q.empty() && !flag) { int pos; int size = q.size(); steps++; while (size--) { pos = q.front(); q.pop(); if (pos + 1 == k || pos - 1 == k || pos * 2 == k) { flag = 1; break; } if (pos + 1 >= 0 && pos + 1 <= 100000 && !vis[pos + 1]) { vis[pos + 1] = 1; q.push(pos + 1); } if (pos - 1 >= 0 && pos - 1 <= 100000 && !vis[pos - 1]) { vis[pos - 1] = 1; q.push(pos - 1); } if (pos >= 0 && 2 * pos <= 100000 && !vis[pos * 2]) { vis[pos * 2] = 1; q.push(pos * 2); } } } } cout << steps << endl; return 0;