抓住那只牛!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 }