当前位置:网站首页>AcWing 1131. 拯救大兵瑞恩 题解(最短路)
AcWing 1131. 拯救大兵瑞恩 题解(最短路)
2022-07-02 18:27:00 【乔大先生】
AcWing 1131. 拯救大兵瑞恩
处理数据非常麻烦的一道题,如何建图记录墙和门,利用set记录门,利用二进制记录钥匙进行匹配,这写操作需要学会记住
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int>PII;
const int N = 15, M = 360, INF = 0x3f3f3f3f;
int h[N * N], ne[M], e[M], w[M], idx; //储存邻接表
int dist[N * N][1 << 11]; //储存状态
deque<PII>q; //储存状态
int n, m, p, k, S;
set<PII>edge; //记录门
int g[N][N];
int dx[4] = {
1, 0, -1, 0};
int dy[4] = {
0, 1, 0, -1};
int key[N * N];
bool st[N * N][1 << 11];
void add(int a, int b, int c){
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx ++ ;
}
void build(){
//建图
for(int i = 1; i <= n; i ++ ){
for(int j = 1; j <= m; j ++ ){
for(int k = 0; k < 4; k ++ ){
int xx = dx[k] + i;
int yy = dy[k] + j;
if(!xx || !yy || xx > n || yy > m) continue; //如果出界,就直接跳过
int a = g[i][j];
int b = g[xx][yy];
if(!edge.count({
a, b})) add(a, b, 0); //如果这个地方没有门,就是一堵墙
}
}
}
}
int bfs(){
memset(dist, 0x3f, sizeof dist);
dist[1][0] = 0; //状态为第一个点,钥匙为0
q.push_back({
1, 0}); //状态为第一个点,钥匙为0
while(q.size()){
auto op = q.front();
q.pop_front();
if(st[op.x][op.y]) continue; //如果这个状态用过
st[op.x][op.y] = true;
if(op.x == n * m) return dist[op.x][op.y];
if(key[op.x]){
//如果这个地方有钥匙
int state = op.y | key[op.x];
if(dist[op.x][state] > dist[op.x][op.y]){
dist[op.x][state] = dist[op.x][op.y];
q.push_front({
op.x, state});
}
}
for(int i = h[op.x]; ~i; i = ne[i]){
int j = e[i];
if(w[i] && !(op.y >> w[i] - 1 & 1)) continue; //如果这里有门但是没钥匙
if(dist[j][op.y] > dist[op.x][op.y] + 1){
//
dist[j][op.y] = dist[op.x][op.y] + 1;
q.push_back({
j, op.y});
}
}
}
return -1;
}
int main()
{
cin>>n>>m>>p>>k;
for(int t = 1, i = 1; i <= n; i ++ ){
for(int j = 1; j <= m; j ++ ){
g[i][j] = t ++ ;
}
}
memset(h, -1, sizeof h);
while(k -- ){
int x1, y1, x2, y2, z;
cin>>x1>>y1>>x2>>y2>>z;
int a = g[x1][y1], b = g[x2][y2];
edge.insert({
a, b}); //记录门或墙
edge.insert({
b, a});
if(z){
add(a, b, z);
add(b, a, z);
}
}
build(); //建图
cin>>S;
while(S -- ){
int a, b, c;
cin>>a>>b>>c;
key[g[a][b]] |= 1 << c - 1; //用二进制存储钥匙
}
cout<<bfs()<<endl;
return 0;
}
边栏推荐
- LeetCode 0871. Minimum refueling times - similar to poj2431 jungle adventure
- What is 9D movie like? (+ common sense of dimension space)
- [paper reading] Ca net: leveraging contextual features for lung cancer prediction
- 451-memcpy、memmove、memset的实现
- Horizontal ultra vires and vertical ultra vires [easy to understand]
- How to print mybats log plug-in using XML file
- Qpropertyanimation use and toast case list in QT
- Data dimensionality reduction factor analysis
- 452-strcpy、strcat、strcmp、strstr、strchr的实现
- AcWing 383. 观光 题解(最短路)
猜你喜欢
冒泡排序数组
Watchful pioneer world outlook Architecture - (how does a good game come from)
PHP-Parser羽毛球预约小程序开发require线上系统
Obligatoire pour les débutants, cliquez sur deux boutons pour passer à un contenu différent
PHP parser badminton reservation applet development requires online system
Talk about the design of red envelope activities in e-commerce system
开发固定资产管理系统,开发固定资产管理系统用什么语音
AcWing 342. 道路与航线 题解 (最短路、拓扑排序)
Why should we build an enterprise fixed asset management system and how can enterprises strengthen fixed asset management
搭建主从模式集群redis
随机推荐
Which video recording software is better for the computer
golang:[]byte转string
Use cheat engine to modify money, life and stars in Kingdom rush
Codeworks 5 questions per day (1700 average) - day 4
Mobile robot path planning: artificial potential field method [easy to understand]
Thread application instance
Yunna | why use the fixed asset management system and how to enable it
Virtual machine initialization script, virtual machine mutual secret key free
C文件输入操作
Npoi export Excel2007
4274. 后缀表达式-二叉表达式树
【ERP软件】ERP体系二次开发有哪些危险?
2022 compilation principle final examination recall Edition
ICDE 2023|TKDE Poster Session(CFP)
Markdown basic grammar
Novice must see, click two buttons to switch to different content
数据降维——主成分分析
Refactoring: improving the design of existing code (Part 1)
教程篇(5.0) 09. RESTful API * FortiEDR * Fortinet 网络安全专家 NSE 5
mysql备份后缀是什么_mysql备份还原