本文最后更新于 2025年8月31日 中午
                  
                
              
            
            
              
                
                题目传送门
洛谷P1588 Catch That
Cow
题目大意(乱搞awa)
在数轴上有一动点x和一定点y,点x每秒前进一个单位长度或后退一个单位长度或移动到当前位置坐标*2的点,问点x到点y最短要几秒
题目分析
很容易看出这是一道广搜(BFS)题(其实我没看出来qwq,我太蒻了)。在这道题目中一个点可以通过三种方式(如题)移动,也就是一个点()只能扩展到三个点,即,,这三个点。所以我们可以采用广搜的方式,用一个队列来记录没有走过的点,同时记录该点的步数,如果这个点等于奶牛的位置就可以输出步数了
广搜是什么?
OI Wiki直达
我的理解:首先用一个队列(可以使STL也可以是手写的)记录初始值,只要队列不为空就循环,扩展该值的可以到达的几个值,再将这几个值入队,知道找到答案。

广搜和深搜的用法区别
同样是寻找目标解,深度优先搜索寻找操作步骤字典序最小的解,而广度优先搜索可以找到步骤最少的解。需要根据题目的性质来决定使用什么搜索算法。
 By 深基
上代码
广搜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
   |  #include <bits/stdc++.h> using namespace std; const int MAX = 100005;  int ans[MAX];            void bfs(int x, int y)   {     memset(ans, 0, sizeof ans);      queue<int> q;                    q.push(x);                       ans[x] = 0;                      while (!q.empty())               {         int hd = q.front();                   q.pop();                              if (hd == y)                              cout << ans[hd] << endl;                   if (hd + 1 <= MAX && ans[hd + 1] == 0)          {             ans[hd + 1] = ans[hd] + 1;              q.push(hd + 1);                     }         if (hd - 1 >= 0 && ans[hd - 1] == 0)          {             ans[hd - 1] = ans[hd] + 1;              q.push(hd - 1);                     }         if (hd * 2 <= MAX && ans[hd * 2] == 0)          {             ans[hd * 2] = ans[hd] + 1;              q.push(hd * 2);                     }     } } int main() {     int t;      cin >> t;     while (t--)      {         int x, y;         cin >> x >> y;          bfs(x, y);          }     return 0; }
 
 
  | 
 
AC记录
深搜
我不会
看这位大佬的吧awa