1.6.1 抓住那头牛

举报
irrational 发表于 2022/01/18 00:16:15 2022/01/18
【摘要】 刚刚讲了bfs,那下面我们就来搞一个bfs的应用 同样先复习bfs模板。 Description 农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N,牛位于点K。 农夫有两种移动方式: 从...

刚刚讲了bfs,那下面我们就来搞一个bfs的应用

同样先复习bfs模板。

Description

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N,牛位于点K。

农夫有两种移动方式:

  1. 从XXX移动到X−1或X+1,每次移动花费一分钟。
  2. 从XXX移动到2∗X,每次移动花费一分钟。

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

Input

第一行为两个整数,分别为N和K。

Output

一个整数,农夫抓到牛所要花费的最小分钟数。

Sample Input 1

5 17

Sample Output 1

4

 

宽度优先遍历
    
        queue<int> q;
        st[1] = true; // 表示1号点已经被遍历过
        q.push(1);

        while (q.size())
        {
            int t = q.front();
            q.pop();

            for (int i = h[t]; i != -1; i = ne[i])
            {
                int j = e[i];
                if (!s[j])
                {
                    st[j] = true; // 表示点j已经被遍历过
                    q.push(j);
                }
            }
        }

这道题目相当于是一个以2的指数级不断扩展的满二叉树,逐渐枚举出所有情况,直到有一次情况满足即可。


  
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. const int N = 200010;
  6. int st[N], n, k;
  7. int q[N];
  8. void bfs()
  9. {
  10. memset(st, -1, sizeof st);
  11. int hh = 0, tt = -1;
  12. q[++ tt] = n;
  13. st[n] = 0;
  14. while(hh <= tt)
  15. {
  16. int u = q[hh ++];
  17. if(u == k) return;
  18. if(u * 2 <= k * 2 && st[u * 2] == -1)
  19. q[++ tt] = u * 2, st[u * 2] = st[u] + 1;
  20. if(u + 1 <= k * 2 && st[u + 1] == -1)
  21. q[++ tt] = u + 1, st[u + 1] = st[u] + 1;
  22. if(u - 1 >= 0 && st[u - 1] == -1)
  23. q[++ tt] = u - 1, st[u - 1] = st[u] + 1;
  24. }
  25. }
  26. int main()
  27. {
  28. scanf("%d%d", &n, &k);
  29. bfs();
  30. printf("%d", st[k]);
  31. return 0;
  32. }

st记录距离

q记录层数

欢迎提问~

文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_54227557/article/details/120604909

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。