• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ACM s1124yy
守りたいものが 強くさせること
博客园    首页    新随笔    联系   管理     

HDU 2717 Catch That Cow(BFS)


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 (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

今天开始,俺终于也走上博客之路了。虽然我现在是个小白 ,但我相信 我可以在acm路上越走越好。

话说这题好坑,最后就差一个maxn没改,竟然给我wrong answer。 我竟看了一个多小时,哎 。 

本题为bfs,多做做bfs的题就会发现,他们都很类似,但本题需要注意,之后的next状态都是根据previous来的。

AC代码:

#include <bits/stdc++.h>
using namespace std;

#define cle(a,b) memset(a,b,sizeof(a))
#define rep(i,b) for(unsigned i=0;i<(b);i++)
int n,k;
const int MAXN=1e6;//这里是6 不是5 就是这个 坑了我好长时间</p>
bool vis[MAXN+10];

struct node
{
    int x,step;
};
bool che(int x)
{
    if(x<0||x>=MAXN||vis[x])
        return 0;
    return 1;
}
int bfs(int x)
{
    queue<node> que;
    node previous,next;
    previous.x=x;
    previous.step=0;
    vis[previous.x]=1;
    que.push(previous);//之后一定要push第一个状态啊 不push怎么会有呢?
    while(que.size())
    {
        previous=que.front();/*previous在外面用 用于第一个状态加入队列 并且在while里面也用 即previous赋值了2次*/
                que.pop(); 
        if (previous.x==k)/*判断结束的条件也是previous的 previous 1次赋初值 1次赋 que.front() 1次判断 1次被next赋值 共用了4次*/
            return previous.step;//最重要的  判断结束条件 return答案
        next = previous;/*next只能够被previous 赋值 并且之后判断next是否能加入队列 */
        next.x=previous.x+1;

        if (che(next.x))//之后的便是判断语句 找符合的状态插入队列
        {
            next.step=previous.step+1;
            vis[next.x]=1;
            que.push(next);
        }
        next.x=previous.x-1;
        if (che(next.x))//if 判断里有 1:答案的步数 应该++ 2:标记vis数组为走过 3:push进队列
        {
            next.step=previous.step+1;
            vis[next.x]=1;
            que.push(next);
        }
        next.x=previous.x*2;
        if (che(next.x))
        {
            next.step=previous.step+1;
            vis[next.x]=1;
            que.push(next);
        }
    }
    return -1;
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        cle(vis,0);
        int ans=bfs(n);
        printf("%d\n",ans);
    }
    return 0;
}
posted @ 2016-03-16 04:44  s1124yy  阅读(134)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3