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

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

 

posted @ 2019-01-19 23:19  SaltyFishQF  阅读(190)  评论(1编辑  收藏  举报