题目链接:戳此进入

这道题如果用DFS就是一路走到头没法向回拐,所以不能用DFS,我们用BFS+队列,广搜一下,

第一先确定人的位置,之后确定牛的位置,如果人在牛前,人就只能后退,那差几步就是几分钟。

第二种是牛在人前面,然后人开始找牛,三种方法,步数+1,步数-1,步数*2,

然后开始遍历,先把人开始的位置压入队列,遍历下面3个地方,判断是否找到,判断是否越界,然后把队列头依次拿出,每次拿出都会往下遍历3种情况,步数+1,步数-1,步数*2,如果有点遍历过了,就不再遍历,每次遍历同时更新步数,

下面是实现代码

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include <algorithm>
using namespace std;queue<int> q;
int  m,n;
int step[100010];
int vis[100010];
int rear,front;//rear表示下一步
int BFS(){int i;q.push(n);//把农民的位置压入队列 step[n]=0;//步数记为0 vis[n]=1;标记这个点走过 while(!q.empty()){//队列不为空哦时执行 front=q.front();//最开始的位置 q.pop();//弹出队列头 for(i=0;i<3;i++)//三种走法,三种循环 {if(i==0)rear=front+1;//第一种下一步+1 if(i==1)rear=front-1;//第二种下一步-1 if(i==2)rear=front*2;//第三种步数翻倍 if(rear>=0&&rear<=100000&&vis[rear]==0)//判断是否越界,并且这一步没有走过 {vis[rear]=1;//标记这一步走过了 step[rear]=step[front]+1;// 步数+1 q.push(rear);//将当前位置压入队列 }if(rear==m)return step[rear];}}return -1;}int main(){cin>>n>>m;memset(step,0,sizeof(step));//初始化为0 memset(vis,0,sizeof(vis));//初始化为falsecout<<BFS();return 0;
}

第二种方法是定义一个结构体


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct node
{int x;int c;
} pos[200000];
int n,k;
queue<node> q;
bool vis[200000];//为什么设置成200000呢?因为p*2的时候就越界了虽然不做判断,但是需要这个范围,如果没有程序会跑崩溃
int bfs()
{int p,cnt;while(!q.empty()){p=q.front().x;//记录位置 cnt=q.front().c;//记录步数 q.pop();//取出队列第一个 if(p==k) return cnt;//如果找到牛就返回了 if(!vis[p-1]&&p>0)//能够退一步  {vis[p-1]=1;pos[p-1].c=cnt+1;pos[p-1].x=p-1;q.push(pos[p-1]);}if(p<k)//如果人再牛后面 {if(!vis[p+1])//能够前进一步 {vis[p+1]=1;pos[p+1].c=cnt+1;pos[p+1].x=p+1;q.push(pos[p+1]);}if(!vis[2*p]){vis[2*p]=1;pos[2*p].c=cnt+1;pos[2*p].x=p*2;q.push(pos[2*p]);}}}
}
int main(){cin>>n>>k;memset(vis,0,sizeof(vis));//初始化 memset(pos,0,sizeof(pos));//初始化 vis[n]=1;//标记这个位置已经搜索过了 pos[n].x=n;//给结构体赋值(位置) pos[n].c=0;//给结构体赋值 (步数) q.push(pos[n]);//把第一个结构体拉入列队 cout<<bfs()<<endl;;return 0;
}
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 100010;
int x, y;
int ans = 0;bool inq[maxn];
struct node{int x;int step;node(){step = 0;}
};bool check(node now){if(now.x < 0 || now.x > 100010){return 0;}return 1;
}
int BFS(node now){queue<node> q;q.push(now);inq[now.x] = 1;while(!q.empty()){node front = q.front();if(front.x == y){return front.step;}q.pop();node next;for(int i = 1; i <= 3;i ++){if(i == 1)next.x = front.x + 1;else if(i == 2)next.x = front.x - 1; else next.x = front.x * 2;if(check(next) && !inq[next.x]){inq[next.x] = 1;next.step = front.step + 1;q.push(next);}}      }return 0;
}int main(){scanf("%d%d", &x, &y) ;node start;start.x = x;int ans;ans = BFS(start);printf("%d\n", ans);return 0;
} 

POJ 3278,抓牛问题(BFS)相关推荐

  1. POJ 3278 Catch That Cow BFS

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32071   Accepted: 9866 D ...

  2. POJ - 3278抓牛牛

    ///题意:大牛怎样最快的抓到小牛:给你大牛和小牛的坐标,大牛怎样才能最快的抓到小牛 ///说来大牛的走位也真是神奇(腿长一点走当前坐标的两倍,短一点就往后退一步或者前进一步) 但是那些走都算一步: ...

  3. poj 3278 catch that cow BFS(基础水)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 61826   Accepted: 19329 ...

  4. BFS POJ 3278 Catch That Cow

    题目传送门 1 /* 2 BFS简单题:考虑x-1,x+1,x*2三种情况,bfs队列练练手 3 */ 4 #include <cstdio> 5 #include <iostrea ...

  5. 深度优先搜索实现抓牛问题

    一 原问题链接 3278 -- Catch That Cowhttp://poj.org/problem?id=3278 二 输入和输出 1 输入 两个数,第1个数代表农夫的位置,第2个数代表牛的位置 ...

  6. C - Catch That Cow POJ - 3278

    C - Catch That Cow POJ - 3278 首先是大暴搜+最优化剪枝(当当前搜索情况不如已有答案优时,返回) #include<cstdio> #include<al ...

  7. POJ 3278 Catch That Cow

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 30924   Accepted: 9536 D ...

  8. POJ 3287 Catch That Cow(bfs)

          看懂意思就很简单了,给你一个数,每次只能加一或者减一或者乘2,问最少几次才能变成另一个数,就是一个简单的bfs过程,看代码吧. AC代码: #include <iostream> ...

  9. POJ 3278 / hdu 2717 Catch That Cow (广搜)

    POJ 3278 HDU 2717 广搜题,用一个数组标记就可以过,不标记的话会超内存. 另外,poj的数据要比hdu强一些,比如0 100,这种数据.不特判的话会RE.不过如果不特判,在poj上用C ...

  10. MACD改良抓牛神器 通达言指标公式 副图 源码 无加密 无未来

    MACD改良抓牛神器 通达言指标公式 副图 源码 无加密 无未来 MACD指标是人们喜欢的一个经典传统指标.MACD是用的最多的指标,有交易的地方都能看到他.但是又有多少人能够真正搞懂了这个指标,大部 ...

最新文章

  1. c语言将水仙花数放入一维数组a中,全国计算机等级考试C语言考试程序设计题(13)...
  2. 中国安防为何世界最强?中科院AI+安防报告,解密8大趋势和8大限制【附下载】| 智东西内参...
  3. logging模块的使用
  4. 斐波那契数列算法分析
  5. linux下增加磁盘改变指定文件路径分区挂载点和迁移数据
  6. 深入V8引擎-AST(2)
  7. dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)
  8. FastDFS简介和安装
  9. 多个ORACLE HOME时的程序连接
  10. 深度学习知识体系总结(2021版)开放下载了!
  11. linux安装telnet客户端_Redis 6.0 的客户端缓存是怎么肥事?一文带你了解!
  12. 喜大普奔,Google 的一小步!
  13. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_6_等待唤醒机制概述...
  14. provide sth for sb; provide sb with sth
  15. word中插入代码_如何在Word中优雅的插入公式
  16. 计算机技能大赛备赛计划,技能大赛计划.doc
  17. Spring data jpa + sqlserver + druid, druid连接sqlserver 报错:查询超时值 -1 无效。
  18. C++程序设计课程设计报告——自助点餐系统
  19. dell服务器510系统,dellr510服务器上安系统.docx
  20. SpringBoot基础知识

热门文章

  1. 华为java一个月写多少行代码_[财经]阿里员工吐槽华为:面试官1万行代码都没写过? - 南方财富网...
  2. UVA_12676_Inverting Huffman(哈夫曼树)
  3. UE4 HUD相关的笔记
  4. android getpixel函数,关于Graphics.Blit函数在android上的巨坑
  5. NSLayoutConstraint动态修改multiplier或constant
  6. 我用 python 做了款可开淘宝店赚钱的工具
  7. linux 网卡绑定解绑,网卡绑定开机绑定,关机解绑
  8. 云和恩墨大讲堂 | 基于PCIE 闪存卡的 Oracle 数据库使用
  9. 2023最新织梦CMS高端红酒酒水类网站模板源码+SEO全屏自适应布局
  10. 《PC Assembly Language》读书笔记