抓住那只牛!Catch That Cow POJ-3278 BFS

本文介绍了一个基于BFS算法解决的抓牛问题。问题设定在数轴上,FJ需要找到丢失的牛,通过前进、后退或传送到当前位置两倍的地方,算法寻找从起点到目标点的最短路径。为了避免重复访问同一位置导致的无限循环,使用了vis数组标记已访问的位置。

题目链接:Catch That Cow

题目大意

FJ丢了一头牛,FJ在数轴上位置为n的点,牛在数轴上位置为k的点。FJ一分钟能进行以下三种操作:前进一个单位,后退一个单位,或者传送到坐标为当前位置两倍的地方。求FJ能找到牛的最短时间。

思路

BFS。在每一个点有三种选择,前进,后退,或者传送。要注意的是,由于有后退的过程,所以可能会造成环,导致队列长度很长就直接MLE了。因此要用一个vis数组来控制不能选择已经去过的地方。

题解

 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5 
 6 int n, k, ans, vis[100005];
 7 struct Location
 8 {
 9     int cur;    //当前位置坐标
10     int num;    //到达这个点所用的步数
11 }l;
12 
13 queue<Location> q;
14 
15 int main(int argc, char const *argv[])
16 {
17     cin >> n >> k;
18     l.cur = n;
19     l.num = 0; 
20     q.push(l);    //初始位置入队
21     while(true)
22     {
23         if(q.front().cur == k)
24         {
25             cout << q.front().num;    //到达K,输出
26             break;
27         }
28         if(q.front().cur-1 >= 0 && vis[q.front().cur-1] == 0)    //判断是否超出范围或者已经走过
29         {
30             l.cur = q.front().cur-1;
31             l.num = q.front().num+1;
32             vis[l.cur] = 1;
33             q.push(l);    //入队
34         }
35         if(q.front().cur+1 <= 100000 && vis[q.front().cur+1] == 0)
36         {
37             l.cur = q.front().cur+1;
38             l.num = q.front().num+1;
39             vis[l.cur] = 1;
40             q.push(l);
41         }
42         if(q.front().cur*2 <= 100000 && vis[q.front().cur*2] == 0)
43         {
44             l.cur = q.front().cur*2;
45             l.num = q.front().num+1;
46             vis[l.cur] = 1;
47             q.push(l);
48         }
49         q.pop();
50     }
51     return 0;
52 }

 

转载于:https://www.cnblogs.com/SaltyFishQF/p/10293692.html

「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值