hdu 5094 Maze (BFS+状压)
题意:
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+状压)的更多相关文章
- HDU 5094 Maze (状压)
加一个维度,钥匙的状态,状压一下.n很小,钥匙也只有10个,bfs就好了. 忘了数组初始化.以后坚决不犯这种低级错误. #include<cstdio> #include<queue ...
- HDU - 5094 Maze(状压+bfs)
Maze This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enter ...
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
- HDU 5094 题解(状压BFS)
题面: Maze 题目中文大意: 这个故事发生在“星际迷航”的背景下. “星际争霸”的副队长史波克落入克林贡的诡计中,被关押在他们的母亲星球Qo’noS上. 企业的上尉詹姆斯·T·柯克(James T ...
- hdu 5094 Maze bfs
传送门:上海邀请赛E 给定一个n×m的迷宫,给出相邻格子之间的墙或者门的信息,墙说明不可走,假设是门则须要有相应的钥匙才干通过,问是否可以从(1,1)到达(n,m) 一个带状态的bfs,再另记一个状态 ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- hdu 4771 Stealing Harry Potter's Precious (BFS+状压)
题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- js判断访客来源网址和关键字
加入现在有A.B两个站,A为友站,B为我站. 希望判断使用从A站连来时,就把访问者拒绝在门外,只要用简单几行的javascript,就可抓到使用的来源,以及作出一些防范的措施. <script ...
- eps出坑出坑
1 visio格式转eps 先将Visio保存为pdf格式文件 使用adobe acrobat编辑pdf 先将文件裁剪至所需大小 随后点编辑,选择全选,然后文件,导出到,内嵌postscript 2 ...
- 虚拟机乌班图系统安装 VMware tools 工具
在VMware虚拟机中安装完毕Linux操作系统之后,我们经常会发现桌面不能全屏显示或者windows主机系统与linux操作系统之间无法创建共享文件夹.这是因为我们还没有安装VMware tools ...
- Jenkins持续交付实战演练
jenkins web hook机制 运行jenkins任务触发方式: 主动运行 定时构建 就算代码库没有更新,也会构建. 通过代码库主动触发Jenkins的构建任务 jenkins向外暴露一个触发器 ...
- php 常用算法与函数
1.一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
- tornado中通用模版
第一: 1.Pycharm新建python项目(不是django项目),在项目下面直接新建server.py,内容如下: 2.安装tornado, pip install tornado import ...
- P3180-[HAOI2016]地图【圆方树,莫队,分块】
正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 \(n\)个点\(m\)条边的一个仙人掌,有点权. \(Q\)次询问给出\(op,x,y\),封 ...
- IE浏览器设置兼容性
因为IE浏览器不兼容高版本的Jquery.Bootstrap等JS框架,导致页面在Google浏览器和在IE的显示完全不一样,所以需要对页面进行兼容性设置 <!--设置兼容性--> < ...
- @Value竟然能玩出这么多花样
前言 对于从事java开发工作的小伙伴来说,spring框架肯定再熟悉不过了.spring给开发者提供了非常丰富的api,满足我们日常的工作需求. 如果想要创建bean实例,可以使用@Controll ...
- 飞猪基于 Serverless 的云+端实践与思考
作者 | 王恒飞(承荫) 本文整理自飞猪旅行前端技术专家--王恒飞(承荫)在[阿里云 Serverless Developer Meetup 上海站]上的分享.点击查看直播回放:https://dev ...