您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: