hdu 1429 胜利大逃亡(续)(bfs+状态压缩)
2015-09-09 21:29
555 查看
[align=left]Problem Description[/align]
[align=left]Input[/align]
[align=left]Output[/align]
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
[align=left]Source[/align]
ACM暑期集训队练习赛(三)
第46行,if((t2.key&(1<<j))==0){//写成 t2.key&(1<<j)==0竟然一直错,%**&*!@#@#@!@!
View Code
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
[align=left]Input[/align]
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括: . 代表路 * 代表墙 @ 代表Ignatius的起始位置 ^ 代表地牢的出口 A-J 代表带锁的门,对应的钥匙分别为a-j a-j 代表钥匙,对应的门分别为A-J 每组测试数据之间有一个空行。
[align=left]Output[/align]
针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
[align=left]Sample Input[/align]
4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
[align=left]Sample Output[/align]
16 -1
[align=left]Source[/align]
ACM暑期集训队练习赛(三)
第46行,if((t2.key&(1<<j))==0){//写成 t2.key&(1<<j)==0竟然一直错,%**&*!@#@#@!@!
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<stdlib.h> #include<algorithm> using namespace std; #define N 26 #define M (1<<10)+6 int n,m,t; char mp ; struct Node{ int x,y; int t; int key; }st,ed; int dirx[]={0,0,-1,1}; int diry[]={-1,1,0,0}; char keys[]={'a','b','c','d','e','f','g','h','i','j'}; char door[]={'A','B','C','D','E','F','G','H','I','J'}; int vis [M]; void bfs(){ queue<Node>q; q.push(st); vis[st.x][st.y][st.key]=1; Node t1,t2; while(!q.empty()){ t1=q.front(); //printf("*** %d%d %d\n",t1.x,t1.y,t1.key); q.pop(); if(t1.x==ed.x && t1.y==ed.y && t1.t<t){ printf("%d\n",t1.t); return; } for(int i=0;i<4;i++){ t2=t1; t2.x=t1.x+dirx[i]; t2.y=t1.y+diry[i]; if(mp[t2.x][t2.y]=='*') continue; if(t2.x<0 || t2.x>=n || t2.y<0 || t2.y>=m) continue; if(vis[t2.x][t2.y][t2.key]) continue; if(islower(mp[t2.x][t2.y])){ for(int j=0;j<10;j++){ if(mp[t2.x][t2.y]==keys[j]){ if((t2.key&(1<<j))==0){//写成 t2.key&(1<<j)==0竟然一直错,%**&*!@#@#@!@! t2.key+=(1<<j); t2.t++; vis[t2.x][t2.y][t2.key]=1; q.push(t2); } else{ //printf("+++%d\n",t2.key); if(vis[t2.x][t2.y][t2.key]==0){ t2.t++; vis[t2.x][t2.y][t2.key]=1; q.push(t2); } } } } } else if(isupper(mp[t2.x][t2.y])){ for(int j=0;j<10;j++){ if(mp[t2.x][t2.y]==door[j]){ if(t2.key&(1<<j)){ t2.t++; vis[t2.x][t2.y][t2.key]=1; q.push(t2); } } } } else{ t2.t++; vis[t2.x][t2.y][t2.key]=1; q.push(t2); } } } printf("-1\n"); } int main() { while(scanf("%d%d%d",&n,&m,&t)==3){ for(int i=0;i<n;i++){ scanf("%s",mp[i]); for(int j=0;j<m;j++){ if(mp[i][j]=='@'){ st.x=i; st.y=j; st.t=0; st.key=0; } if(mp[i][j]=='^'){ ed.x=i; ed.y=j; } } } memset(vis,0,sizeof(vis)); bfs(); } return 0; }
View Code
相关文章推荐
- (视频)vivi驱动层代码分析
- css选择器优先级
- Effective C++——条款31(第5章)
- Nginx环境下http和https(ssl)共存的方法
- hadoop 词频统计&&adoop jar jar包名.jar 包名.主类名 输入路径(文件的目录,不包括文件本身) 输出路径
- IntentService,(Looper,Message,Handler)三者之间的关系,AsyncTask,
- 原型模式的浅克隆和深克隆
- 我的14~15——越磨砺,越坚强!
- 50种方法优化SQL Server数据库查询
- Android菜鸟的启航
- 115 城市平乱【dijkstra】
- git clone时直接提交用户名和密码
- jQuery中 wrap() wrapAll() 与 wrapInner()的区别
- 阿里飞天云平台架构简介
- 八皇后问题的两种解决方法
- .NET基础 (08)字符串处理
- Android绘制的一些总结onMeasure,onLayout,onDraw
- UVA 10118 dfs
- 当页面完全加载完成后执行一个js函数
- HDU 3966 Aragorn's Story(树链剖分)