当前位置: 首页 > news >正文

题解:P14002 [eJOI 2025] Navigation

题意:有一个仙人掌,但是不告诉你这个图。现在有一个完全没有任何记忆的机器人,每次只告诉你当前走到这个点的颜色和邻点的颜色,保证每次给出点颜色的顺序都一样,你每次可以结束或者给当前点染色并走向一个点。设计一个策略遍历所有点。

做法:

首先树是好做的,直接记录深搜栈即可,栈里的标 \(2\),搜过的标 \(1\)。有 \(0\)\(0\),没有走 \(1\)

考虑点仙人掌,即一个点属于最多一个环的情况。仍然考虑树的做法,发现问题在于出现环的时候解决不了谁是父亲的情况。我们考虑把当前点标为 \(3\) 并随便往一个 \(2\) 走,发现如果是父亲,那么 \(2\) 周围只会有 \(1\)\(2\),而返祖边会有两个。如果走到返祖边就往 \(3\) 回来走即可。

然后考虑边仙人掌,一个点可能属于两个环,那么我们上面的算法就会在两个环的交点出发现有两个 \(2\) 一个 \(3\),就会误判为我走到了一个返祖边,所以我们需要消掉这个 \(3\) 才能保证正确性。

我们考虑走到返祖边回来的时候我们就把当前点标 \(1\) 即可,如果是父亲,我们就把父亲标成 \(0\) 再走回去,这样如果一个点为 \(3\) 并且周围有 \(0\),那么我们就把他变为 \(1\) 并且走向 \(0\) 即可。

代码:

#include<bits/stdc++.h>
using namespace std;
pair<int, int> navigate(int c, vector<int> g) {int cnt[4] = {0, 0, 0, 0}, p[4] = {0, 0, 0, 0};for (int i = 0; i < g.size(); i++)cnt[g[i]]++, p[g[i]] = i;if(cnt[3])return make_pair(cnt[2] > 1 ? 2 : 0, p[3]);if(cnt[0])return make_pair(c == 3 ? 1 : 2, p[0]);if(cnt[2] == 1)return make_pair(1, p[2]);if(cnt[2] == 2) {if(c == 0 || c == 2)return make_pair(3, p[2]);if(c == 3) {int nw = 0;for (int i = 0; i < g.size(); i++)if(g[i] == 2) {nw = i;break;}return make_pair(1, nw);}}return make_pair(-1, -1);
}
//int main() {
//	return 0;
//}
http://www.jsqmd.com/news/43108/

相关文章:

  • 多媒体与可视化:WebAssembly集成与实时视频贴图
  • 第三章作业 动态规划
  • Java Room与SQLite如何交互
  • 11月17日日记
  • 第三十一天
  • wsl 常用命令
  • AI模型的github——ModelScope.co和Hugging Face.cn
  • 屋顶望月
  • 逆向基础--C++ 运算符 (05)
  • 团队管理与技术驱动
  • 日总结 27
  • 随缘打赏
  • java linux 中文
  • java linux jdk
  • 用 Go 进行验证码识别
  • Spring AI Alibaba 项目源码学习(十)-Interceptor
  • 用 Swift 进行验证码识别
  • 20232311 2025-2026-1 《网络与系统攻防技术》实验六实验报告
  • 线程池的概念
  • 奶牛快传服务调整公告
  • 从零实现 REINFORCE/GRPO —— 大模型推理强化微调实践
  • java for linux 下载
  • 13 个 pytest 宝藏插件推荐!(存存存)
  • iOS开发Linux
  • 手撸大模型的分布式训练:深刻理解大模型训练的“起飞”原理
  • XHORSE XZBT42EN 2-Button HON.D PCBs for Honda Fit XR-V Jazz City 2018-2022 (5pcs/lot)
  • 事件循环其实很简单!
  • 从0到1:揭秘LLM预训练前的海量数据清洗全流程
  • AI技术落地实践
  • Day22flex布局