Hero In Maze
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 1565 Submission Accepted: 241
Total Submission: 1565 Submission Accepted: 241
Description
500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。
时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T
500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。
他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。
突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。
时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T
500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。
他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。
Input
题目包括多组测试数据。
每组测试数据以三个整数N,M,T(0 < N,M <= 20)开头,
分别代表迷宫的长和高,以及公主能坚持的天数。
紧接着有M行,N列字符,由".","*","P","S"组成。其中
"." 代表能够行走的空地。
"*" 代表墙壁,Jesse不能从此通过。
"P" 是公主所在的位置。
"S" 是Jesse的起始位置。
每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。
输入以0 0 0结束。
每组测试数据以三个整数N,M,T(0 < N,M <= 20)开头,
分别代表迷宫的长和高,以及公主能坚持的天数。
紧接着有M行,N列字符,由".","*","P","S"组成。其中
"." 代表能够行走的空地。
"*" 代表墙壁,Jesse不能从此通过。
"P" 是公主所在的位置。
"S" 是Jesse的起始位置。
每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。
输入以0 0 0结束。
Output
如果能在规定时间内救出公主输出“YES”,否则输出“NO”。
Sample Input
Original | Transformed |
4 4 10 .... .... .... S**P 0 0 0
Sample Output
Original | Transformed |
YES
DFS会超时,所以用BFS,BFS算法如下
#include<stdio.h>
#include<string.h>
char maze[50][50];
int book[50][50];
struct node
{
int x;
int y;
int s;
};
int main()
{
int m,n,t;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
struct node queue[2500];
memset(book,0,sizeof(book));
int xs,ys,xe,ye;
if(m==0&&n==0&&t==0)return 0;
for (int i = 1;i <= m;i++)
{
getchar();
for (int j = 1;j <= n;j++)
{
scanf("%c",&maze[i][j]);
if (maze[i][j] == 'S')
{
xs = i;ys = j;
}
if (maze[i][j] == 'P')
{
xe = i;ye = j;
}
}
}
int flag=0;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int head=1,tail=1;
queue[tail].x=xs;
queue[tail].y=ys;
queue[tail].s=0;
tail++;
book[xs][ys]=1;
while(head<tail)
{
int tx,ty;
for(int k=0;k<4;k++)
{
tx=queue[head].x+next[k][0];
ty=queue[head].y+next[k][1];
if(tx<1||tx>m||ty<1||ty>n)
continue;
if((maze[tx][ty]=='.'||maze[tx][ty]=='P')&&book[tx][ty]==0)
{
book[tx][ty]=1;
queue[tail].x=tx;
queue[tail].y=ty;
queue[tail].s=queue[head].s+1;
tail++;
}
if(tx==xe&&ty==ye)
{
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
if(queue[tail-1].s<=t&&flag==1)
printf("YES\n");
else printf("NO\n");
}
return 0;
}