SDUTOJ_2193_救基友记3
2016-02-18 09:57
246 查看
救基友记3
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
思路:每拿到一个钥匙,都可进入一个新的状态,且这些状态是相互组合的,想到二进制,例如:10101(二进制数),代表拥有了a,c,e钥匙;用一个三维数组存储,vis[x][y][k],x,y代表坐标,k代表所处的层(状态);
题目描述
话说CZ由于不守基道,被妖怪抓走了,好基友WP在努力讨好高富帅RQ救出CZ的同时,CZ也意识到了自己的错误,然后努力的想逃出妖怪的闺房。妖怪的闺房是一个n*m的矩阵,并且某些地方安装了带锁的门,钥匙藏在闺房另外的某些地方。刚开始WP被关在(sx,sy)的位置,离开闺房的门在(ex,ey)的位置。WP每分钟只能从一个坐标走到相邻四个坐标中的其中一个。妖怪每t分钟回闺房视察一次,若发现CZ不在原位置便把他再拎回去。经过若干次的尝试,CZ已画出整个闺房的地图。现在请你帮他计算能否再次成功逃亡。只要在妖怪下次视察之前走到出口就算离开闺房,如果妖怪回来的时候刚好走到出口或还未到出口都算逃亡失败。
输入
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为闺房的地图,其中包括:. 代表路
* 代表墙
@ 代表CZ的起始位置
^ 代表闺房的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j
代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
输出
针对每组测试数据,如果可以成功逃亡,请输出最少需要多少分钟才能离开,如果不能则输出-1。示例输入
4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
示例输出
16 -1
提示
来源
示例程序
#include <iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; bool vis[21][21][1100]; int n,m,t; char mp[21][21]; struct node { int x,y,step,key; };queue<node>Q; int ch[][2]={{1,0},{-1,0},{0,-1},{0,1}}; void judge(node &tmp) { int x=tmp.x,y=tmp.y,k=tmp.key; if(x>=0&&x<n&&y>=0&&y<m&&!vis[x][y][k]&&mp[x][y]!='*') { if(mp[x][y]>='A'&&mp[x][y]<='Z') { if(k&(1<<(mp[x][y]-'A'))) { vis[x][y][k]=1; tmp.step++; Q.push(tmp); } } else if(mp[x][y]>='a'&&mp[x][y]<='z') { if(!(k&(1<<(mp[x][y]-'a')))) { tmp.key+=1<<(mp[x][y]-'a'); } vis[x][y][k]=1; tmp.step++; Q.push(tmp); } else { vis[x][y][k]=1; tmp.step++; Q.push(tmp); } } } int BFS(int sx,int sy,int ex,int ey) { memset(vis,0,sizeof(vis)); while(!Q.empty())Q.pop(); node now,tmp; now.x=sx,now.y=sy,now.step=now.key=0; vis[sx][sy][0]=1; Q.push(now); while(!Q.empty()) { now=Q.front(),Q.pop(); if(now.x==ex&&now.y==ey) return now.step; for(int i=0;i<4;i++) { tmp=now; tmp.x+=ch[i][0],tmp.y+=ch[i][1]; judge(tmp); } } return t+1; } int main() { int sx,sy,ex,ey; int ans; while(~scanf("%d%d%d",&n,&m,&t)) { sx=ex=-1;ans=t+1; for(int i=0;i<n;i++) { scanf("%s",mp[i]); for(int j=0;j<m;j++) { if(mp[i][j]=='@') sx=i,sy=j; else if(mp[i][j]=='^') ex=i,ey=j; } } if(sx==-1||ex==-1) ans=t+1; else ans=BFS(sx,sy,ex,ey); if(ans>=t) printf("-1\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- 文字输出尺寸测量方法, MeasureString不准确的问题
- IntelliJ集成CheckStyle
- 苹果默认字体
- CUDA 一维卷积实现
- JSP取得绝对路径
- iOS中定时器NSTimer的使用
- MyBatis insert操作返回主键
- kinect指尖识别
- javascript中的一些常用方法:call() , apply() , slice() , sort()
- 中英文并排
- Android开发中R.java文件丢失或无法更新的解决方法
- ToString()
- JDBC—Connection、Statement、ResultSet
- poj2398 Toy Storage
- 解决导出excel表格时间慢的问题
- 分析软件性能(6)
- Mysql insert 性能优化
- 欢迎使用CSDN-markdown编辑器
- SolrCloud的官方配置方式
- ToolStrip失去焦点时,点击第二次才执行事件的解决方法