胜利大逃亡(续)
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 22 Accepted Submission(s) : 10
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,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-j
a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-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
做完这题,我感觉自己不得不写一篇解题报告来解释了;
这题最大的精华就是它用了三维数组;
分析题目,就是当你拿到钥匙后,你该如果去寻找门,
因为,当你走到拿钥匙的地方的时候,可以门已经被你标记为走完了,
所以,大神们用了三维数组来解决,
当你拿到钥匙后,就进入另一个从未被标记过的二维空间,
再次进行广搜,就是,当你拿到钥匙,你就进入一个空间,当你打开一扇门,你就掉出一个空间,
这就是这道题目的精华所在,I think
#include<iostream> #include<queue> #include<cstring> using namespace std; struct node { int x, y, t, key; }; int n, m, t; int sx, sy; char g[25][25]; bool vis[25][25][1<<10]; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; bool flag; void myscanf() { for(int i=0;i<n;i++) { scanf("%s",g[i]); for(int j=0;j<m;j++) { if(g[i][j]=='@') { sx = i; sy = j; g[i][j]='.'; } } } } void bfs() { queue<node>q; node cur, v; cur.x = sx; cur.y = sy; cur.t = 0; cur.key = 0; vis[cur.x][cur.y][cur.key] = true; q.push(cur); while(!q.empty()) { v = q.front(); q.pop(); if(v.t<t && g[v.x][v.y]=='^') { printf("%d ",v.t); flag = true; return; } for(int i=0;i<4;i++) { cur.x = v.x + dx[i]; cur.y = v.y + dy[i]; cur.t = v.t + 1; cur.key = v.key; if(g[cur.x][cur.y]>='a'&&g[cur.x][cur.y]<='z') cur.key=v.key|(1<<(g[cur.x][cur.y]-'a')); if(g[cur.x][cur.y]=='*'||cur.t>=t) continue; else if(cur.x<0||cur.x>=n||cur.y<0||cur.y>=m||vis[cur.x][cur.y][cur.key]) continue; else { vis[cur.x][cur.y][cur.key] = true; if(g[cur.x][cur.y]>='A' && g[cur.x][cur.y]<='Z') { if(cur.key&(1<<(g[cur.x][cur.y]-'A'))) { q.push(cur); } } else q.push(cur); } } } } int main() { while(scanf("%d%d%d",&n,&m,&t)!=EOF) { flag = false; memset(vis,false,sizeof(vis)); memset(g,0,sizeof(g)); myscanf(); bfs(); if(!flag) printf("-1 "); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。