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

算法题(176):three states

审题:

本题需要我们找到最佳铺设道路,将三个国家联通起来,然后输出最佳铺设道路的铺设数量,若没有联通方法则输出-1

思路:

首先我们正面思考:只需从某个点出发然后搜索到三个国家即可,最后对比所有距离中最小的

缺陷:这种方法需要考虑的前提很多,我们的国家不一定是连在一起的,可能都分开,可能其中两个国家连起来,有可能都是直接连起来的,所以不太好写代码

正难则反:我们可以从每个国家开始搜索,搜索出三张铺设图,然后根据这三张图的数据对每个非#点进行距离计算,最后筛出最短铺设数并输出

搜索方法:01BFS

由于铺设的时候遇到荒地可以铺设,遇到国家的时候不用铺设,所以对于铺设数的权值就是0和1.我们就可以采用01bfs了

解题:

#include<iostream> #include<cstring> #include<deque> using namespace std; const int N = 1010; typedef pair<int, int> PII; int n, m; char a[N][N]; int dis[4][N][N]; int dx[] = { 1,-1,0,0 }; int dy[] = { 0,0,1,-1 }; void bfs(int num) { //清除痕迹 deque<PII> q; memset(dis[num], -1, sizeof dis[num]); //源点放入deque for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (num == a[i][j] - '0') { q.push_back({ i,j }); dis[num][i][j] = 0; } } } //01bfs while (q.size()) { PII t = q.front(); q.pop_front(); int x0 = t.first, y0 = t.second; for (int k = 0; k < 4; k++) { int x = x0 + dx[k], y = y0 + dy[k]; if (x >= 1 && x <= n && y >= 1 && y <= m && a[x][y] != '#') { char next = a[x][y]; int w = (next == '.' ? 1 : 0); if (dis[num][x][y] == -1)//首次遇到 { dis[num][x][y] = dis[num][x0][y0] + w; if (w == 0) q.push_front({ x,y }); else q.push_back({ x,y }); } else if(dis[num][x0][y0] + w < dis[num][x][y])//松弛操作 { dis[num][x][y] = dis[num][x0][y0] + w; } } } } } int main() { //数据录入 cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; } } //搜索出三张铺设图 bfs(1); bfs(2); bfs(3); //根据三张图筛出结果并输出 int ret = 0x3f3f3f3f; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (a[i][j] == '#') continue;//石头无法联通 int x = dis[1][i][j], y = dis[2][i][j], z = dis[3][i][j]; if (x == -1 || y == -1 || z == -1) continue;//该点到达不了 if (a[i][j] == '.')//减去重复铺设的格子 { ret = min(ret, x + y + z - 2); } else { ret = min(ret, x + y + z); } } } if (ret == 0x3f3f3f3f) { cout << -1 << endl; } else { cout << ret << endl; } return 0; }

注意:

1.最后在统计的时候遇到石头是可以直接跳过的,而当距离中存在负数的时候说明有一个国家是无法到达的,此时也可以直接跳过

2.对于统计点为荒地的时候由于该地会被铺设三次,所以我们需要减2,统计国家地块的时候我们就直接加就行了,因为国家地块是不会进行铺设的,所以不存在重复铺设的情况

CF590C Three States - 洛谷

http://www.jsqmd.com/news/803916/

相关文章:

  • 2026年南京专业留学中介机构前十强全面解析 - 速递信息
  • 清镇名表回收技术全解析:清镇靠谱的黄金回收/清镇高价回收黄金/清镇黄金回收上门/清镇黄金回收正规/清镇黄金回收靠谱/选择指南 - 优质品牌商家
  • 2026年5月邢台启闭机/螺杆启闭机/斜拉启闭机/手电螺杆启闭机/双吊点卷扬启闭机厂家解析,认准新河县全方水工机械厂 - 2026年企业推荐榜
  • 告别串口打印!用STM32CubeMonitor实时可视化你的变量波形(附F4正弦波Demo)
  • 利用taotoken模型广场为ai应用快速进行模型选型与测试
  • 动作设计模式:HTTP API动作标准化终极指南
  • 厚街吉他培训哪家值得推荐:秒杀吉他培训 服务贴心 - 19120507004
  • Diem隐私计算:安全多方计算在区块链中的终极应用指南
  • 管理多个APIKey并设置访问控制与审计日志
  • 2026年Q2常德无人机培训专业选择核心技术维度解析:怀化无人机培训/株洲无人机培训/永州无人机培训/湘潭无人机培训/选择指南 - 优质品牌商家
  • 2026油电混合SUV推荐:可油可电可增程,一台车覆盖全场景 - 速递信息
  • 使用Node.js和Taotoken快速构建一个AI对话微服务
  • 如何为现有基于OpenAI SDK的项目无缝迁移到Taotoken聚合平台
  • 【实战篇 / ZTNA】(7.0) ❀ 从零部署:FortiClient EMS 7.0 与 FortiGate 的联动配置 ❀ 零信任网络访问
  • ComfyUI-WanVideoWrapper终极指南:3个技巧解决AI视频生成难题
  • Midjourney Ziatype印相全流程实战手册(含官方未公开--style raw适配矩阵与gamma校准表)
  • 浙江音乐学院校考培训核心技术要点与备考路径解析:浙江音乐艺考机构、浙江音乐艺考集训、杭州器乐艺考培训、杭州声乐艺考培训选择指南 - 优质品牌商家
  • RPGMZ 插件制作教程 如何保存变量值到游戏存档
  • 劝!别直接用AI写论文!深扒毕业之家和PaperRed哪个才是真降重[特殊字符]
  • 2026年北京留学中介机构对比,反馈及时哪些比较好值得关注 - 速递信息
  • 【信息科学与工程学】【管理科学】第七十篇 中国主要类型企业的交易与利益交换/利益输送模型02
  • 2026年安徽二手PCB设备买卖与产能扩充完全指南 - 优质企业观察收录
  • 12-production-best-practices 生产实践:观测、安全、成本、评测和持续演进
  • ASN.1编解码实战:从协议规范到C语言实现
  • 如何快速掌握QQ截图独立版:Windows平台终极截图与OCR识别工具完全指南
  • 选购鸟牌Bird功率计,这些型号值得了解——总代理深圳新朗普的一手推荐 - 品牌推荐大师1
  • 2026天津大牌首饰哪里估价靠谱?卡地亚宝格丽实地探店 - 奢侈品回收测评
  • Hermes Agent 可视化监控与文档生成工具 hermes-dashboard 详解
  • 2026年住校生卫生巾囤货:高性价比品牌选型指南 - 产业观察网
  • 拓扑排序 学习笔记