hdu 1429 胜利大逃亡(续)
来源:互联网 发布:linux pipe 编辑:程序博客网 时间:2024/06/09 14:45
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
Input
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:. 代表路* 代表墙@ 代表Ignatius的起始位置^ 代表地牢的出口A-J 代表带锁的门,对应的钥匙分别为a-ja-j 代表钥匙,对应的门分别为A-J每组测试数据之间有一个空行。
Output
针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
Sample Input
4 5 17@A.B.a*.*.*..*^c..b*4 5 16@A.B.a*.*.*..*^c..b*
Sample Output
16-1
【分析】题目倒是挺有意思,走迷宫,还带钥匙,还是比较有意思,题目其实不难,开始我直接bfs,后来内存超限,后来发现,钥匙只有十个,存储状态的时候可以直接开一个state,倒是我想复杂了,其他的没啥。
【代码】
#include <bits/stdc++.h>using namespace std;char mat[25][25];bool vis[25][25][1034];int sx,sy;int lenx,leny,sumtime;struct P{ int state;//用来存储钥匙的状态 int x,y;//坐标 int t;//时间};int changex[4]={0,0,1,-1};int changey[4]={1,-1,0,0};bool not_in_mat(int x,int y)//判断在不在图中{ if(x<1||x>lenx) return true; if(y<1||y>leny) return true; return false;}bool cal(P&a){//判断当前状态符不符合要求 if(mat[a.x][a.y]=='*') return false; if(not_in_mat(a.x,a.y)) return false; else if(a.t>=sumtime) return false; else if(mat[a.x][a.y]<='J'&&mat[a.x][a.y]>='A'&&((a.state&(1<<(mat[a.x][a.y]-'A')))==0)) return false; else if(mat[a.x][a.y]<='j'&&mat[a.x][a.y]>='a') a.state|=(1<<(mat[a.x][a.y]-'A')); else if(vis[a.x][a.y][a.state]) return false; vis[a.x][a.y][a.state]=true; return true;}int bfs(void){ queue<P> x; P a,b; a.state=0; a.x=sx; a.y=sy; a.t=0; x.push(a); vis[a.x][a.y][a.state]=true; while(!x.empty()) { a=x.front(); x.pop(); for(int i=0;i<4;i++) { b.x=a.x+changex[i]; b.y=a.y+changey[i]; b.t=a.t+1; b.state=a.state; if(cal(b)) x.push(b); if(mat[b.x][b.y]=='^'&&b.t<sumtime) return b.t; } } return -1;}int main(){// freopen("in.txt","r",stdin); while(scanf("%d%d%d",&lenx,&leny,&sumtime)!=EOF) { memset(vis,false,sizeof(vis)); for(int i=1; i<=lenx; i++) for(int j=1; j<=leny; j++) { scanf(" %c",&mat[i][j]); if(mat[i][j]=='@') sx=i,sy=j; } printf("%d\n",bfs()); } return 0;}
阅读全文
0 0
- HDU 1429 胜利大逃亡(续)
- hdu 1429胜利大逃亡(续)
- hdu 1429 胜利大逃亡(续)
- HDU 1429 胜利大逃亡(续)
- hdu 1429 胜利大逃亡(续)
- hdu 1429 胜利大逃亡(续)
- HDU 1429 胜利大逃亡(续)
- hdu 1429胜利大逃亡(续)
- HDU 1429 胜利大逃亡(续)
- hdu 1429 胜利大逃亡(续)
- hdu-1429 胜利大逃亡(续)
- HDU 1429 胜利大逃亡(续)
- Hdu 1429 胜利大逃亡(续)
- hdu 1429 胜利大逃亡(续)
- HDU--1429 胜利大逃亡(续)
- 1429 胜利大逃亡( 续 ) hdu
- HDU 1429 胜利大逃亡(续)
- hdu 1429 胜利大逃亡(续)
- HDU 1176
- 动态规划之最长公共子序列
- arttemplate模板--字符串拼接中使用模板语法
- EL表达式三元运算符
- [Trie] BZOJ4896: [Thu Summer Camp2016]补退选
- hdu 1429 胜利大逃亡(续)
- LoadRunner学习笔记——Day2
- Angularjs 双重循环获取父级下标$index
- 使用GDI +加载JPG和PNG资源的CGdiPlusBitmap类
- MongoDB聚合查询
- springboot开发(yml配置和注解解析)
- zend Studio快捷键操作说明
- Java的异常处理
- 职业规划