题意:

n*m的迷宫。多多要从(1,1)到达(n,m)。每移动一步消耗1秒。有P种钥匙。

有K个门或墙。给出K个信息:x1,y1,x2,y2,gi    含义是(x1,y1)与(x2,y2)之间有gi。gi=0:墙   1,2,3.... :第1种门,第2种门,第3种门.....

有S把钥匙。给出S个信息:x1,y1,qi    含义是位置(x1,y1)上有一把第qi种的钥匙。

问多多最少花多少秒到达(n,m)。若无法到达输出-1。

数据范围:

(1<= n, m <=50, 0<= p <=10).

(0<= k <=500)

(0<= S <=50)

思路:

n,m很小。经典BFS+状压,

注意的是,同一位置上可能有多把钥匙。(注意到S的范围是S<=50)

还有一个要注意:位运算式子的处理要仔细。(最好测试一下)。

代码:

struct node{
int x,s;
node(int _x,int _s){
x=_x, s=_s;
}
}; int n,m,p,k,S;
int xx1,yy1,xx2,yy2,gi;
int mazeG[55][55][55][55], mazeK[55][55][15];
int dp[55][55][1050]; int bfs(){
queue<node> q;
mem(dp,-1);
int s=0;
rep(i,1,p) if(mazeK[1][1][i]>0) s|=(1<<(i-1));
q.push(node(101,s));
dp[1][1][s]=0;
if(1==n && 1==m) return 0;
while(!q.empty()){
node f=q.front(); q.pop();
rep(i,0,3){
int nx=f.x/100+uu[i], ny=f.x%100+vv[i];
int _s=f.s;
if(nx<=0||ny<=0||nx>n||ny>m||(mazeG[f.x/100][f.x%100][nx][ny]==0)) continue; //overBound or meet the wall. if(mazeG[f.x/100][f.x%100][nx][ny]>0){
int yes=_s&(1<<(mazeG[f.x/100][f.x%100][nx][ny]-1));
if(yes==0) continue; //don't have corresponding key.
}
int ns=_s;
rep(i,1,p) if(mazeK[nx][ny][i]) ns|=(1<<(i-1));
if(dp[nx][ny][ns]!=-1) continue;
q.push(node(nx*100+ny,ns));
dp[nx][ny][ns]=dp[f.x/100][f.x%100][_s]+1;
if(nx==n&&ny==m) return dp[nx][ny][ns];
}
}
return -1;
} int main(){
while(scanf("%d%d%d",&n,&m,&p)!=EOF){ //p kinds of doors
scanf("%d",&k);
mem(mazeG,-1); //doors or walls
mem(mazeK,false); //keys
rep(i,1,k){
scanf("%d%d%d%d%d",&xx1,&yy1,&xx2,&yy2,&gi);
mazeG[xx1][yy1][xx2][yy2]=gi;
mazeG[xx2][yy2][xx1][yy1]=gi;
}
scanf("%d",&S); // S keys
rep(i,1,S){
scanf("%d%d%d",&xx1,&yy1,&gi);
mazeK[xx1][yy1][gi]=true;
}
printf("%d\n",bfs());
}
}

hdu 5094 Maze (BFS+状压)的更多相关文章

  1. HDU 5094 Maze (状压)

    加一个维度,钥匙的状态,状压一下.n很小,钥匙也只有10个,bfs就好了. 忘了数组初始化.以后坚决不犯这种低级错误. #include<cstdio> #include<queue ...

  2. HDU - 5094 Maze(状压+bfs)

    Maze This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enter ...

  3. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

  4. HDU 5094 题解(状压BFS)

    题面: Maze 题目中文大意: 这个故事发生在“星际迷航”的背景下. “星际争霸”的副队长史波克落入克林贡的诡计中,被关押在他们的母亲星球Qo’noS上. 企业的上尉詹姆斯·T·柯克(James T ...

  5. hdu 5094 Maze bfs

    传送门:上海邀请赛E 给定一个n×m的迷宫,给出相邻格子之间的墙或者门的信息,墙说明不可走,假设是门则须要有相应的钥匙才干通过,问是否可以从(1,1)到达(n,m) 一个带状态的bfs,再另记一个状态 ...

  6. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  7. hdu 4771 Stealing Harry Potter's Precious (BFS+状压)

    题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...

  8. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  9. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. PHP中的日期相关函数(二)

    上回文章中我们介绍了三个时间日期相关的对象,不过它们的出镜频率并不是特别地高.今天学习的对象虽说可能不少人使用过,但是它的出镜频率也是非常低的.它们其实就是我们非常常用的那些面向过程的日期函数的面向对 ...

  2. Java基础系列(15)- 用户交互Scanner

    Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.java.util.Scanner是Java5的新特征.我们可以 ...

  3. 为什么说Mysql预处理可以防止SQL注入

    简单点理解:prepareStatement会形成参数化的查询,例如:1select * from A where tablename.id = ?传入参数'1;select * from B'如果不 ...

  4. python学习笔记(十五)-unittest单元测试的一个框架

    unittest 单元测试的一个框架什么框架 一堆工具的集合. TestCase TestSuite 测试套件,多个用例在一起 TestLoader是用来加载TestCase到TestSuite中的 ...

  5. 鸿蒙内核源码分析(自旋锁篇) | 当立贞节牌坊的好同志 | 百篇博客分析OpenHarmony源码 | v26.02

    百篇博客系列篇.本篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 当立贞节牌坊的好同志 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 当立贞节牌坊 ...

  6. YbtOJ#532-往事之树【广义SAM,线段树合并】

    正题 题目链接:https://www.ybtoj.com.cn/problem/532 题目大意 给出\(n\)个点的一个\(Trie\)树,定义\(S_x\)表示节点\(x\)代表的字符串 求$$ ...

  7. iOS实现XMPP通讯(一)搭建Openfire

    安装Openfire Openfire官网下载地址:https://igniterealtime.org/downloads/ (也是Spark客户端的下载地址) Openfire下载并安装后,打开系 ...

  8. Spring Boot引入Swagger并对界面进行美化

    Swagger是一个接口文档生成工具,在前后端分离的开发中经常会用到,下面就来介绍下Swagger的使用: 引入依赖 <dependency> <groupId>io.spri ...

  9. 搭建Mac+Java+appium+IOS真机自动化环境

    一.安装前环境准备 1.确保电脑已经有homebrew(包管理器)  下载链接[https://brew.sh/]   2.通过 brew 安装node.js brew install node 安装 ...

  10. dubbo注册中心占位符无法解析问题

    dubbo注册中心占位符无法解析问题 1.背景 最近搞了2个老项目,想把他们融合到一起.这俩项目情况简介如下: 项目一:基于SpringMVC + dubbo,配置读取本地properties文件,少 ...