审题:
本题需要我们找出每一组数据中,fj找到牛所需要的最短步数,并将其打印出来
时间复杂度:
bfs的时间复杂度是O(N),而本题的搜索次数最多为1e5,所以时间复杂度是允许的
思路:
方法一:bfs+记忆化搜索
由于本题普通的贪心策略是不行的,所以我们就不考虑贪心,而是暴力搜索所有情况,不过在搜索过程中,我们如果遇到了完全相同的数据就需要查看备忘录,以减少搜索次数
解题:
(1)初始化
#include<iostream> #include<queue> using namespace std; const int N = 1e5+10; bool f[N];//备忘录 int t,x, y;
(2)main函数
int main() {cin >> t;while (t--)//多组数据{cin >> x >> y;bfs();}return 0; }
bfs的作用就是打印出当前组的数据最短步数
(3)bfs+记忆化搜索
void bfs() {int distance = 1;queue<int> q;for (int i = 0; i < N; i++) f[i] = false; // 每次新的测试用例初始化访问数组q.push(x);f[x] = true;while (!q.empty()){int size = q.size();for (int j = 0; j < size; j++)//当前批次搜索{int fj = q.front();q.pop();int d[3] = { fj + 1,fj - 1,2 * fj };//方向数组for (auto& e : d){if (e == y)//找到牛了{cout << distance << endl; return;}else if ((fj + e) > 0 && e <= 1e5 && f[e] != true)//对已经进入过队列的数据不再入队{q.push(e);f[e] = true;//访问记录}}}distance++;} }
注意:
1.一旦遇到了值等于y,那么此时的distance就是最短距离:因为我们是一步步进行遍历的,所以最先搜索到y的就是最短距离
2.备忘录需要重新初始化:由于备忘录是全局变量,且我们有多组数据需要判断,所以要重新初始化防止上一组的数据残留影响当前组的判断
3.方向数组的建立:最关键的是对2*x的理解,他是动态的这个x表示的就是当前位置的值,而不是一开始录入的最开始的位置的值x
P1588 [USACO07OPEN] Catch That Cow S - 洛谷
算法题(112):catch the cow
2025/4/2 1:33:34
来源:https://blog.csdn.net/2301_79954395/article/details/146773556
浏览:
次
关键词:算法题(112):catch the cow
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
- 华为 海思22AP10(SS524)H.265 编解码处理器用户指南
- 数据库物理结构设计
- 基于重要抽样的主动学习不平衡分类方法ALIS
- 如何在 Mac 上清空硬盘后恢复丢失的数据?
- npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法
- 《缺失MRI模态下的脑肿瘤分割的潜在相关表示学习》| 文献速递-深度学习肿瘤自动分割
- (2)Django生产环境数据库的切换以及环境配置python-dotenv方案
- 【微信小程序】自定义组件 - 组件的生命周期
- 大模型分离架构学习记录
- 概率图模型在自然语言处理中的应用