第一篇博客,格式惨不忍睹。首先感谢一下鼓励我写博客的大佬@Titordong其次就是感谢一群大佬激励我不断前行@Chunibyo@Tiancfq因为室友tanty强烈要求出现,附上他的名字。

Catch That Cow(POJ3278)

BFS入门题,然鹅我还是WA了四五发,因为没注意,位置0是可以访问的。再者就是初始位置在push之后,要标记为已经访问。

图片挺不错,我们地大(武汉)的旖旎风光,放松一下。

题目链接:POJ3278

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 X - 1 or X + 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.

题意:

这个题建立模型,可以理解为在0-maxn的x轴上,农夫在N点,奶牛在K点,有一下三种方式农夫可以改变自己的位置,每次改变花费一分钟,求到达奶牛的位置的最短时间。

题解:

这个题求最短路,可以想到用BFS。

这里复习一下BFS,BFS本质就是搜索,在搜索过程中,为每一个节点分层,到达目标节点,结束搜索,可以确保找到最优解。由于BFS保存结点数目较多,采用队列实现。这个题我的男神郭炜老师的课件用一个结构体保存每一个点的位置和到达该位置的步数,如下,简单明了。

struct node{
int step,pos;
node(int pos=0,int step=0) : pos(pos),step(step){}
};

也可只用一个vis数组,用于判断是否被访问和当前的步数。基本的BFS题。

还有一点对于BFS的多组输入的题,每次vis数组要清空,q队列清空。

代码

#include<cstdio>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
//节点拓展,分层,判重。确保找到最优解,但保存节点较多,多数节点需要保存,队列 typedef long long ll;
const int maxn = 100000;
int vis[500000 + 10];
void Bfs(int n, int k)
{
memset(vis, 0, sizeof(vis));
queue<int>q;
while (!q.empty()) q.pop(); //注意调用前要先清空
q.push(n);
vis[n] = 1;
while (!q.empty())
{
int u = q.front(); q.pop();
if (u== k)//找到目标,结束搜索
{
cout << vis[k]-1 << endl;
return;
}
else {
//这里是大于等于。
if (u - 1 >= 0 && !vis[u - 1]) {
q.push(u - 1);
vis[u - 1] = vis[u]+ 1;//上一个节点的下一层
}
if (u + 1<=maxn && !vis[u +1]) {
q.push(u +1);
vis[u+1] = vis[u] + 1;
}
if (2 * u <= maxn && !vis[2 *u])
{
q.push(2 * u);
vis[2 * u] = vis[u] + 1;
} }
} }
int main()
{ int n, k;
while (cin >> n >> k)
{
if (n >= k)cout << n - k << endl;//可以用来加快运行,小的剪枝
else
Bfs(n, k);
}
return 0;
}

本题结束啦,ACM之路还没结束......

POJ 3278 Catch That Cow[BFS+队列+剪枝]的更多相关文章

  1. poj 3278 Catch That Cow(bfs+队列)

    Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...

  2. POJ 3278 Catch That Cow(BFS,板子题)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 88732   Accepted: 27795 ...

  3. poj 3278 Catch That Cow (bfs搜索)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 46715   Accepted: 14673 ...

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

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

  5. POJ - 3278 Catch That Cow BFS求线性双向最短路径

    Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch he ...

  6. poj 3278 Catch That Cow bfs

    Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...

  7. POJ 3278 Catch That Cow bfs 难度:1

    http://poj.org/problem?id=3278 从n出发,向两边转移,为了不使数字无限制扩大,限制在2*k以内, 注意不能限制在k以内,否则就缺少不断使用-1得到的一些结果 #inclu ...

  8. POJ - 3278 Catch That Cow bfs 线性

    #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> usi ...

  9. BFS POJ 3278 Catch That Cow

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

随机推荐

  1. 从public void onPreviewFrame(byte[] data, Camera arg1)拿到Bitmap(收集)

    private PreviewCallback pc = new PreviewCallback(){ public void onPreviewFrame(byte[] data, Camera a ...

  2. Shell函数的7种用法介绍

    1. 在shell文件内部定义函数并引用: 复制代码代码如下: [~/shell/function]# cat factorial.sh #!/bin/bashfunction factorial{f ...

  3. 【C】——实现tree命令

    在大部分的linux系统中有一个很好用的命令——tree,就是显示目录的结构,但是发现在FreeBSD中没有这个命令,因此自己实现了一个简单的tree.代码如下:主要利用了递归的思想. #includ ...

  4. Ruby学习小记

    ruby安装 方法一:使用apt-get安装 可以直接使用两个命令完成Ruby的安装. # sudo apt-get update # sudo apt-get install ruby 或者 # s ...

  5. 【转帖】Mysql多维数据仓库指南 第一篇 第1章

     Mysql多维数据仓库指南 第一篇基本原理 章节列表: 第1章:基本组成 第2章:维度历史 第3章:维度可加性 第4章:维度查询 本篇概述 你将运用关系数据库来实施一个维度数据仓库.事实表和维表这两 ...

  6. Python——特殊属性与方法

    Python 对象 中以双下划线开头和结尾的属性称为特殊属性,由于对象的方法也属于属性,因此以双下划线开头和结尾的方法称为特殊方法.对这些对象执行一些特定的运算时,Python会自动视图调用这些实例的 ...

  7. Hbase学习笔记——基本CRUD操作

    进入Hbase的安装目录,启动Hbase bin/start-hbase.sh 打开shell命令行模式 bin/hbase shell 关闭Hbase bin/stop-hbase.sh 一个cel ...

  8. SQL导出数据到EXCEL的问题

    DTS导出向导 不会 我这有个是用C#语言写的 try { Excel.Application xApp = new Excel.ApplicationClass(); xApp.Visible = ...

  9. AngularJS中$timeout和$interval的用法详解

    1. 先将$interval,$timeout,作为参数注入到controller中,例如rds.controller('controllerCtrl', ['app', '$scope','$htt ...

  10. @Transactional(readOnly=true) in Spring

    http://www.skill-guru.com/blog/2010/12/19/transactionalreadonlytrue-in-spring/ @Transactional(readOn ...