POJ 3278 Catch That Cow 【bfs+队列】

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

原题链接:http://poj.org/problem?id=3278

算法:bfs+队列+STL(C++)

PS:bfs入门题目,好高兴啊,终于会用bfs了。大笑

Catch That Cow
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 32679 Accepted: 10060

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. Farmer John has two modes of transportation: walking and teleporting.

* Walking: FJ can move from any point X to the points - 1 or + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.

If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

Input

Line 1: Two space-separated integers:  N and  K

Output

Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

Sample Input

5 17

Sample Output

4

Hint

The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.

Source


题意:

          FJ要抓奶牛。

         开始输入N(FJ的位置)K(奶牛的位置)。

         FJ有三种移动方法:1、向前走一步,耗时一分钟。

                                              2、向后走一步,耗时一分钟。

                                             3、向前移动到当前位置的两倍N*2,耗时一分钟。

       问FJ抓到奶牛的最少时间。PS:奶牛是不会动的。

 

思路:1、如果FJ不在奶牛后面,那么他只有一步步往后移动到奶牛位置了,即N>=K时,输出N-K即可。

          2、否则bfs+队列查找(具体见下面的分析&&代码区)

相关算法:

            1、STL中的队列。(PS:周四才在数据结构上了解bfs的真正思想,惭愧啊!)

                需要的头文件:STL是C++中的 #include<iostream>

                                                                 using namespace std;

                                         queue队列容器的头文件 #include<queue>

               queue队列的相关用法:先进先出(FIFO)

                                                     入队push()   //即插入元素

                                                     出队pop()    //即删除元素

                                                     front()        //读取队首元素

                                                     back()       //读取队尾元素

                                                     empty()     //判断队列是否为空

                                                     size()        //读取队列当前元素的个数         

              2、bfs思想:节点进行广度优先搜索的顺序。

                                                                         

                               搜索实现方法(非递归):

                               算法思想:1.设置一个队列Q,从顶点出发,遍历该顶点后让其进队;

                                                 2.出队一个顶点元素,求该顶点的所有邻接点(对应于此题即FJ的三种走法),

                                                    对于没有遍历过的邻接点遍历之,并 让其进队;

                                                 3.若队空停止,队不空时继续第2步。

                             关于bfs数据结构思想的详细介绍:http://zh.wikipedia.org/wiki/BFS


看了牛人博客后的代码,总算了解bfs了,Orz

代码一:C++STL&&bfs版本:

PS :很奇怪在POJ中AC了,今天交到hdu中去WA了,后来问了KB神才知道是没有清空队列,POJ是单组输入的。而数组模拟的不存在这个问题是因为每        次调用bfs数组下标都是从0开始的。

       还有就是队列清空不存在 q.clear(); 要用 
        while(!q.empty()) q.pop(); //注意调用前要先清空
  

//Accepted	984K	79MS	C++	1128B	2012-11-10 00:44:26
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;

const int maxn=100001;

bool vis[maxn];//标记数组
int step[maxn];//记录到了每一位置所走的步数
queue <int> q;//定义队列

int bfs(int n,int k)
{
    int head,next;
    q.push(n);   //开始FJ在n位置,n入队
    step[n]=0;
    vis[n]=true; //标记已访问
    while(!q.empty())  //当队列非空
    {
        head=q.front();  //取队首
        q.pop();         //弹出对首
        for(int i=0;i<3;i++)     //FJ的三种走法
        {
            if(i==0) next=head-1;
            else if(i==1) next=head+1;
            else next=head*2;
            if(next<0 || next>=maxn) continue; //排除出界情况
            if(!vis[next])  //如果next位置未被访问
            {
                q.push(next);    //入队
                step[next]=step[head]+1;  //步数+1
                vis[next]=true;  //标记已访问
            }
            if(next==k) return step[next];  //当遍历到结果,返回步数
        }
    }
}
int main()
{
    int n,k;
    while(cin>>n>>k)
    {
        memset(step,0,sizeof(step));
        memset(vis,false,sizeof(vis));
        
        while(!q.empty()) q.pop(); //注意调用前要先清空
        if(n>=k) printf("%d\n",n-k);
        else printf("%d\n",bfs(n,k));
    }
    return 0;
}


代码二:C语言+bfs+模拟队列版本 hdu 和poj都能AC

//Accepted	736K	0MS	C++	1017B	2012-11-10 04:24:09
#include<stdio.h>
#include<string.h>
const int maxn=100001;
bool vis[maxn];
int n,k;
struct Node
{
    int x,step;
};
Node q[maxn];
int bfs()
{
    int i;
    Node now,next;
    int head,tail;
    head=tail=0;
    q[tail].x=n;
    q[tail].step=0;tail++;
    vis[n]=true;
    while(head<tail)
    {
        now=q[head];//取队首
        head++;//弹出对首
        for(i=0;i<3;i++)
        {
            if(i==0) next.x=now.x-1;
            else if(i==1) next.x=now.x+1;
            else next.x=2*now.x;
            if(next.x<0 || next.x>=maxn) continue;//剪枝、排除越界
            if(!vis[next.x])
            {
                vis[next.x]=true;
                next.step=now.step+1;
                q[tail].x=next.x;q[tail].step=next.step;tail++;
                if(next.x==k) return next.step;
            }
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        memset(vis,false,sizeof(vis));
        if(n>=k) printf("%d\n",n-k);
        else printf("%d\n",bfs());
    }
    return 0;
}
















Podman修改镜像源教程(附最新docker镜像源) 阅读详情

相关推荐

Isaac Sim 车辆动力学:从参数调优到户外仿真的挑战与实战

本文深入探讨了Isaac Sim在车辆动力学仿真中的应用,从参数调优到户外场景模拟的实战经验。详细解析了悬架系统、轮胎物理模型等核心参数的设置技巧,并分享了应对户外仿真挑战的实用方案。通过Vehicle Wizard高级使用和传感器配置,帮助开发者高效完成车辆仿真与算法开发。

weixin_29192211的博客 380

USACO 2007 Open Silver】City Horizon 线段树

题目描述 题目大意 矩形面积并(虽然这道题很水) 数据范围 n<=40000 A,B<=10^9 样例输入 4 2 5 1 9 10 4 6 8 2 4 6 3 样例输出 16 解题思路 离散化+线段树 线段树写了很久没写出来,被迫换成权值线段树 ...

a15063149271的博客 257

【网络与爬虫 44】Canvas指纹伪造技术:突破浏览器图形渲染检测的终极指南

Canvas和WebGL指纹是现代反爬虫系统中最难绕过的检测技术之一,它们通过分析浏览器图形渲染的细微差异来识别用户设备。本文将深入解析Canvas和WebGL指纹的工作原理,探讨其在反爬虫检测中的应用,并提供多种有效的伪造和绕过策略,帮助开发者理解并应对这些高级检测技术。

熵数实验室 1180

P1588 [USACO07OPEN]Catch That Cow S

Catch That Cow S 注意理解BFS记录每个点步数的操作 #include <bits/stdc++.h> using namespace std; int x,y,dis[100000],t; int BFS() { queue<int> q; q.push(x); int dis[100000]; memset(dis,0x7fffffff,sizeof(dis)); dis[x]=0; while(!q.empty()

R的博客 471

P1588 [USACO07OPEN] Catch That Cow S (dfs+剪枝做法)

FJ 丢失了他的一头牛,他决定追回他的牛。计算他至少需要几步追上他的牛。这是因为当 FJ 的位置与牛的位置相差不大时,可以通过简单的前进或后退操作到达目标,无需翻倍移动。这样做的目的是在搜索过程中实时保持一个初步的最优解(可能不是最终最优解),以防止遗漏某些简单情况下的最优路径。dfs的思想是"不撞南墙不回头",这是一道典型的bfs题,运用dfs会无限递归,所以需要剪枝和限制(自己造一个"南墙")如果满足条件,则直接返回,避免进行无意义的递归搜索,相当于创建一个"南墙"。对于每组数据,输出最少步数。

lddya的博客 611

P1588 [USACO07OPEN] Catch That Cow S

FJ 丢失了他的一头牛,他决定追回他的牛。已知 FJ 和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ 的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2×x的位置。计算他至少需要几步追上他的牛。

zty20120913的博客 1045

题解(图解) 洛谷 P1985/POJ 3279/USACO 2007 Open Silver Fliptile 小白解法+讲解原理

原创文章: https://www.huilon.net.cn/article/21 洛谷 P1985/POJ 3279 Description Farmer John 知道智商高的奶牛产奶量也会很大,所以他为奶牛们准备了一个翻瓦片的益智游戏,来看看它们谁最智商最高。 在一个 M×NM \times NM×N 的矩阵上,每个格子作为一个瓦片都可以翻转。瓦片的一面是黑色,另一面是白色。对一个瓦片进行一次翻转,可以让它的颜色由黑到白,或是由白到黑。 但是奶牛们的蹄脚实在太大了,它们翻转一个格子的瓦片时,与其有公

u014771367的博客 450

POJ 3278 --- Catch That Cow队列 || bfs

POJ 3278 --- Catch That Cow队列 || bfs 题目来源:点击进入【POJ 3278Catch That Cow】 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at...

来日浅谈的博客 559

POJ 3278 Catch That CowBFS+队列

传送门 题意 给定n和k,通过n+1.n-1.n*2三种操作,使得n==k,问最小操作数 思路 1.设置一个队列Q,从顶点出发,遍历该顶点后让其进队; 2.出队一个顶点元素,求该顶点的所有邻接点(对应于此题即FJ的三种走法), 对于没有遍历过的邻接点遍历之,并让其进队; 3.若队空停止,队不空时继续第2步。 即若n=5,则将4,6,10入队列。 代码 int vis[maxn],step[maxn]; queue<int>q; int bfs(int n,int k){ int now,n

幼儿园大哥~ 195

POJ——3278 Catch That CowBFS队列

相比于POJ2251的三维BFS,这道题做法思路完全相同且过程更加简单,也不需要用结构体,check只要判断vis和左右边界的越界情况就OK。 记得清空队列,其他没什么好说的。 #include<iostream> #include<queue> #include<cstring> #include<cstdio> usin...

131

POJ 3278 Catch That Cow[BFS+队列+剪枝]

第一篇博客,格式惨不忍睹。首先感谢一下鼓励我写博客的大佬@Titordong其次就是感谢一群大佬激励我不断前行@Chunibyo@Tiancfq因为室友tanty强烈要求出现,附上他的名字。 Catch That Cow(POJ3278) BFS入门题,然鹅我还是WA了四五发,因为没注意,位置0是可以访问的。再者就是初始位置在push之后,要标记为已经访问。 图片挺不错,我们地大(武汉)的旖旎风光...

weixin_34419321的博客 234

Catch That Cow POJ - 3278 BFS+队列(入门)

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,0...

weixin_43620849的博客 1010

POJ3278 - Catch That Cowbfs队列

Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 68324   Accepted: 21515 Description Farmer John has been informed of the location of a fugit

wyg1997 665

POJ-3278-Catch That CowBFS/队列

Catch That Cow 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...

一直努力 322

POJ 3278 Catch That Cow(BFS+队列)

题目链接:http://poj.org/problem?id=3278 题目大意是:给定n和k,一个代表农夫的位置,一个代表牛的位置,然后农夫有三种操作一种是步数+1,一种是步数-1,一种是步数*2,最少要几步操作能到达牛的位置样例5 17 就可以通过 5 -> 4 -> 8 -> 16 > 17或者 5 -> 10 -> 9 -> 18 -> 17很好的广搜题~~不难#include<iostre

zmjのblog 286

poj3278 Catch That CowBFS算法和队列

哈哈,还记得老师说过所有关于奶牛的poj

SuperNova 1320

poj3278 Catch That Cow |bfs|队列|Java

http://poj.org/problem?id=3278 import java.sql.Time; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main{ public static int...

之虎者也的博客 290

POJ 3278 Catch That Cow队列+bfs

题意: 给出农夫和牛的位置,求农夫抓到牛的最短时间,农夫可以选择前进一步,后退一步,当前位置坐标变成两倍。每做出一次选择都要花费一秒、 思路: 以前是用数组做的,现在重新用队列做了一遍,vis标记的时候=打成==,结果死循环。 #include #include #include #include #define mx 100000 using namespace std; stru

blaze_jack 208

4.3 BFS

4.3 BFS 紫书那里我们当时是先学习的二叉树的BFS,再学的简单图的BFS,最后往更深入的学习回溯,路劲寻找问题和A*算法,IDA*算法,黑书这里将这些汇总了起来放在一章节进行介绍(只是希望不要像上上章那么坑就好)。 4.3.1 BFS队列 首先要知道BFS(广度优先搜索)和DFS(深度优先搜索)都是最基本的两大暴力搜索技术,常用于解决最简单的图和树的遍历问题。那么如何区分和理解两种算法呢?我们以老鼠走迷宫为例,有两种不同的方法: 1.一只老鼠走迷宫。它在每个路口都选择先走某个固定的方向,直到碰壁无

weixin_55835175的博客 278

poj3278-简单搜索练习

POJ3278 解题报告: 1.三种操作,从N到K。简单搜索喽。DFS。 2.状态? 就是坐标了。 3.转移? 三种操作N到next.x喽。 #include #include #include #include using namespace std; #define N 100000 int n, m, vis[N+10]; int bfs() {

ling_xiao007的专栏 464
上一篇: POJ 1753 Flip Game【翻转棋盘+枚举+dfs】
下一篇: uva 11437 Triangle Fun
Cfreezhan
博客等级 码龄15年 274粉丝 198原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值