问题 G: 打败魔王
时间限制: 2 Sec 内存限制: 128 MB提交: 43 解决: 6
[ 提交][ 状态][ 讨论版]
题目描述
可怜的公主又被魔王抓走了。魔王这次准备在T时刻与公主成亲,不过公主深信智勇的骑士CZY肯定能将她救出。
已知:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。
CZY一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那CZY就会被撞死。
CZY在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
输入
输入有多组测试数据。
每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。
接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
输出
如果CZY能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
样例输入
1 4 2 .#.# *.#P
样例输出
NO
就广搜啊
#include<cstdio>
#include<cstring>
#include<queue>
using
namespace
std;
char
map[3][12][12];
int
vis[3][12][12];
int
r,c,k;
int
dirx[6]={1,-1,0,0};
int
diry[6]={0,0,1,-1};
struct
node
{
int
z,x,y,t;
friend
bool
operator < (node a,node b)
{
return
a.t > b.t;
}
};
int
judge(
int
z,
int
x,
int
y)
{
if
(z<0||z>1||x<0||x>=r||y<0||y>=c)
return
0;
if
(vis[z][x][y]||map[z][x][y]==
'*'
)
return
0;
if
(map[z][x][y]==
'#'
&&(map[!z][x][y]==
'*'
||map[!z][x][y]==
'#'
))
return
0;
return
1;
}
void
bfs()
{
priority_queue<node>q;
node ss,now,next;
ss.z=0;
ss.x=0;
ss.y=0;
ss.t=0;
vis[0][0][0]=1;
q.push(ss);
while
(!q.empty())
{
now=q.top();
q.pop();
if
(map[now.z][now.x][now.y]==
'P'
&&now.t<=k)
{
printf
(
"YES\n"
);
return
;
}
if
(now.t>=k)
continue
;
for
(
int
i=0;i<4;++i)
{
next.z=now.z;
next.x=now.x+dirx[i];
next.y=now.y+diry[i];
if
(judge(next.z,next.x,next.y))
{
next.t=now.t+1;
if
(map[next.z][next.x][next.y]==
'#'
)
next.z=!next.z;
q.push(next);
}
}
}
printf
(
"NO\n"
);
}
int
main()
{
while
(~
scanf
(
"%d%d%d"
,&r,&c,&k))
{
memset
(vis,0,
sizeof
(vis));
for
(
int
i=0;i<r;++i)
scanf
(
"%s"
,map[0][i]);
for
(
int
i=0;i<r;++i)
scanf
(
"%s"
,map[1][i]);
bfs();
}
}