POJ3278 抓奶牛 BFS

来源:互联网 发布:能查高数题的软件 编辑:程序博客网 时间:2024/04/28 12:51

嗯弱弱的开始了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;


0 0
原创粉丝点击