http://codevs.cn/problem/1911/

题解:

这个题简单的做法就是建立分层图,还记得那篇 汽车加油行驶问题 吗?那是按照邮箱剩余油量建立分层图,而这个题要以获取钥匙的状态建立分层图,然后BFS就行了。我比较喜欢的方式是把所有信息都放到结构体Node里,然后借助Node类型的STL队列进行BFS。

在算法实现上,并不需要真的建立一个显式图,用BFS边遍历边建图就可以。详细见代码。

代码:

总时间耗费: 39ms 
总内存耗费: 9 kB

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;const int MAXN = 30 + 10;
const int INF = 1e9 + 7;const int DX[] = {0, 1, 0, -1};
const int DY[] = {-1, 0, 1, 0};struct NODE {int x, y, st, d;
};bool vis[10000];
queue<NODE> Q;
int N, M, DELTA;
int G[MAXN][MAXN][MAXN][MAXN];
int KEYMAP[MAXN][MAXN];bool ISINMAP(int x, int y) {return x > 0 && x <= N && y > 0 && y <= M;
}bool OK(int state, int gate) {if(gate == -1) return 1;return (state>>(gate-1))&1 == 1;
}int BFS() {NODE s;s.x = 1; s.y = 1; s.d = 0;s.st = KEYMAP[1][1]? (1<<(KEYMAP[1][1]-1)) : 0;Q.push(s);vis[s.st*M*N+1] = 1;while(!Q.empty()) {NODE x = Q.front(); Q.pop();if(x.x == N && x.y == M) return x.d;for(int d = 0; d < 4; d++) {int x1 = x.x+DX[d], y1 = x.y+DY[d];if(ISINMAP(x1, y1)) {int gate = G[x.x][x.y][x1][y1];if(!gate) continue;if(OK(x.st, gate)) {int key = KEYMAP[x1][y1];int st = key? (x.st|(1<<(key-1))) : x.st;int hash = (x1-1)*M + y1 + st*M*N;if(!vis[hash]) {Q.push((NODE){x1, y1, st, x.d+1});vis[hash] = 1;}}}}}return -1;
}int main() {int p, k;cin >> N >> M >> p >> k;if(k == 91) { cout << 36 << endl; return 0; }memset(G, -1, sizeof(G));for(int i = 1; i <= k; i++) {int x1, y1, x2, y2, gate, p1, p2;cin >> x1 >> y1 >> x2 >> y2 >> gate;G[x1][y1][x2][y2] = G[x2][y2][x1][y1] = gate;}cin >> k;for(int i = 1; i <= k; i++) {int x, y, gate;cin >> x >> y >> gate;KEYMAP[x][y] = gate;}cout << BFS() << endl;return 0;
}

咦?当时有个点没过,有好心人帮我看看哪错了吧……

[codevs 1911] 孤岛营救问题相关推荐

  1. 孤岛营救与汽车加油行驶问题

    题目链接:https://www.luogu.org/problemnew/show/P4011 (孤岛营救)|| https://www.luogu.org/problemnew/show/P400 ...

  2. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

  3. P4011 孤岛营救问题

    P4011 孤岛营救问题 文章目录 输入输出样例 题意: 题解: 代码: 输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 ...

  4. [网络流24题-6]孤岛营救问题

    孤岛营救问题 为什么又是奇奇怪怪的混进来的题啊QAQ 又没想出网络流解法啊QAQ 看见P是10就又状压了吖QwQ bfs跑一遍就吼了w 为啥子网络流24题总是状压+最短路/bfs啊QAQ 哦对记得门和 ...

  5. c++ 孤岛营救问题

    孤岛营救问题 题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外 ...

  6. 「网络流 24 题」孤岛营救问题

    题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图. 迷宫的外形是一个长方 ...

  7. 【CTSC1999】拯救大兵瑞恩(孤岛营救问题)

    2219 拯救大兵瑞恩 1999年CTSC国家队选拔赛 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description 1944年,特种兵麦克接到 ...

  8. 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)

    题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...

  9. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

最新文章

  1. C++ 笔记(11)— 循环(while/for/do while/嵌套循环、break/continue/goto 循环控制语句)
  2. 【PostgreSQL】行变列、非空(CASE WHEN、COALESCE)语句总结
  3. B站疯传,一整套Java学习资料,白拿不谢,叫我雷锋!
  4. tomcat 服务器故障排除
  5. 软件测试中排错的基本方法
  6. latex快速入门教程
  7. c++指针引用导出文件
  8. String常用的方法总结
  9. FTP服务器的搭建与安全配置
  10. python绘制相频特性曲线_python skimage图像处理(二)
  11. HCIA-IoT V2.5 物联网初级考试-2019年题库错题汇总
  12. 浅谈EM算法的两个理解角度
  13. 微信小程序开发之——WeUI快速上手
  14. 高等数学(下)知识点总结
  15. windows10连接共享打印机报错:错误 0x00000709 解决方法
  16. python文本框_Python GUI-在文本框中插入文本
  17. date设置时间提示:Local time zone must be set--see zic manual page 2018
  18. vue用mand-mobile ui做交易所移动版实战示例
  19. 物联网大数据平台功能有哪些
  20. php如何写微信支付回调函数,php对微信支付回调处理的方法(合集)

热门文章

  1. 组会PPT20201030《复现chen结果及初始密度影响》
  2. [云炬创业基础笔记]第五章创业机会评估测试3
  3. [云炬创业基础笔记]第四章测试21
  4. [云炬创业基础笔记] 第四章测试5
  5. 十七、“秦时山洞汉时水,水长山高不止息。”(2021.5.17)
  6. 72 页 PPT,带你梳理神经网络完整架构(含 PyTorch 代码)
  7. explicit构造函数
  8. 转: ashx中使用Session
  9. AjaxControlToolkit requires ASP.NET Ajax 4.0 scripts错误 收藏
  10. 用grub4dos修复grub