本文最后更新于 2024年7月29日 下午
题目传送门
洛谷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
加油OIer