码迷,mamicode.com
首页 > 其他好文 > 详细

Catch That Cow POJ-3278 BFS

时间:2019-01-20 00:13:17      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:入队   string   location   ace   ble   控制   namespace   hat   ==   

题目链接: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 }

 

Catch That Cow POJ-3278 BFS

标签:入队   string   location   ace   ble   控制   namespace   hat   ==   

原文地址:https://www.cnblogs.com/SaltyFishQF/p/10293692.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!