Catch That Cow抓住那只奶牛(BFS,广度优先搜索)

# **Catch That Cow(抓住那只奶牛)**
【题意】:农场主要去追一直逃跑的牛,每次移动有三种选择,位置加一,位置减一,位置乘二,要找到最快的方法让农夫追到牛(也就是移动的次数最少,这个过程是线性的)
具体的题目请见:[原题链接:](http://poj.org/problem?id=3278)。
思路:
从题目中位置移动就可以看出是一个搜索问题,又加上要找最快的方法,也就是在暗示这个是一个广搜题,每次搜索有三个方向,是一个常规题,不过也有细节,请跟随笔者我思路。

代码:

#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
int vis[100005],step[100005];//vis数组是为了避免重复的搜索,step数组则是记录移动的次数。
int bfs(int a,int b)
{
    queue<int>q;
    q.push(a);
    step[1]=0;
    vis[a]=1;
    if(a>b)
    return a-b;//这里是一个小坑,当农夫的位置比奶牛大的时候农夫只能通过自减到达奶牛的位置。
    while(!q.empty())
    {
        int k=q.front();
        q.pop();
        if(k==b)
        return step[k];
        else
        {
            if(!vis[k-1]&&k-1>=0&&k-1<=100000)//第一种方法减一;
            {
                q.push(k-1);
                vis[k-1]=1;
                step[k-1]=step[k]+1;
            }
            if(!vis[k+1]&&k+1<=100000&&k+1>=0)//第二种方法加一;
            {
                q.push(k+1);
                vis[k+1]=1;
                step[k+1]=step[k]+1;
            }
            if(!vis[k*2]&&k*2<=100000&&k*2>=0)//第三种方法增倍;
            {
                q.push(k*2);
                vis[k*2]=1;
                step[k*2]=step[k]+1;
            }
        }
    }
    return 0;
}
int main(void)
{
    int n,k;//n是农夫的位置,k是奶牛的位置。
    memset(vis,0,sizeof vis);//初始化
    memset(step,0,sizeof step);//初始化
    cin>>n>>k;//单组输入。
    cout<<bfs(n,k)<<endl;
    return 0;
}

咳咳小结一下:

第一次写博客,心情有点激动,回过头来看这个题也是比较基础的特别适合0基础的算法学习者,在接触BFS这个算法的时候,用这个题练练手,此题不难,不过也有细节的地方比如当n>k的时候就不用搜索,直接返回n-k就可,还有边界,不能越界,不能越界,不能越界!!!。

原文地址:https://www.cnblogs.com/YHH520/p/12229330.html

时间: 2024-08-10 16:11:17

Catch That Cow抓住那只奶牛(BFS,广度优先搜索)的相关文章

BZOJ 1646: [Usaco2007 Open]Catch That Cow 抓住那只牛( BFS )

BFS... -------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define rep( i , n ) for( int i = 0

bzoj1646[Usaco2007 Open]Catch That Cow 抓住那只牛*

bzoj1646[Usaco2007 Open]Catch That Cow 抓住那只牛 题意: 数轴上,起点在n,终点在k,每次走可以向左走一步或向右走一步或瞬移到当前坐标的两倍位置,问最少走几次.0≤n,k≤100000. 题解: bfs,允许走的位置边界为[0,max(n,k)+1].下界为0原因是如果走到小于0的位置,k≥0,则瞬移和往左走都是南辕北辙,只能向右走,那么一开始就不应该走到小于0的位置导致浪费时间.上界为max(n,k)+1的原因是如果你走到了大于这个数的位置,k必定小于当

BFS(广度优先搜索)

///POJ 3278 Catch That Cow #include<stdio.h>#include<string.h>#include<iostream>#include<queue>using namespace std; int step[100010];int vis[100010];queue <int> q; int BFS(int n, int k){ int i; int head, next; q.push(n); step

GraphMatrix::BFS广度优先搜索

查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, int j) //相对于顶点j的下一邻接顶点 { while ((-1 < j) && (!exists(i, --j))); return j; } //逆向线性试探(改用邻接表可提高效率) 对于图中的所有顶点,对每一个连通区域进行BFS: template <typename

步步为营(十六)搜索(二)BFS 广度优先搜索

上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起始状态的长度" 那么广度是什么呢? 个人认为,能够这么归纳: 何为广度? 能够看做"距离初始状态距离相等的结点"的集合 那么BFS的核心思想就是:从初始结点開始,搜索生成第一层结点.检查目标结点是否在这些结点中,若没有,再将全部第一层的结点逐一进行搜索,得到第二层结点,并逐一检查

关于宽搜BFS广度优先搜索的那点事

以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口并选择其他岔路.接下来将介绍的广度优先搜索(Breadth First Search, BFS)则是以广度为第一关键词,当碰到岔道口时,总是先一次访问从该岔道口能直接到达的所有节结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点,以此类推,直到所有结点都被访问为止.这就跟平静的水面

Catch That Cow 杭电2717【BFS】

Problem 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. F

bzoj1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛 [BFS]

Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T (0 < T <= 15)秒后,FJ又在位置(R2, C2)与贝茜撞了正着. FJ并不知道在这T秒内贝茜是否曾经到过(R2, C2),他能确定的只是,现在贝茜在那里. 设S为奶牛在T秒内从(R1, C1)走到(R2, C2)所能选择的路径总数,F

BFS - 广度优先搜索 - 邻接列表表示法

2017-07-25 21:40:22 writer:pprp 在DFS的基础上加上了一个BFS函数 #include <iostream> #include <queue> using namespace std; const int N = 9; queue<int> qu; int visited[N] = {0}; //新引入一个数组,用于标记是否访问过 struct node { int vertex; node*next; }; node head[N];