题面:
500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,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结束。
Output
如果能在规定时间内救出公主输出“YES”,否则输出“NO”。
Sample Input
4 4 10
….
….
….
S**P
0 0 0
Sample Output
YES
大致思路:
裸的BFS,按照标准的BFS流程走就行了。然后边界条件就是走的步数大于t,和找到了公主
代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct{
int x,y,step;
}Node;
queue<Node> q;
int main()
{
int f[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//四个方向
bool mp[25][25];
char a[25][25];
int n,m,t;
//freopen("in.txt","r",stdin);
while(cin>>n>>m>>t&&(m||n||t))
{
bool ans=false;
queue<Node> p;
swap(p,q);//清空队列用,其实无所谓
Node s;
s.step=0;//初始化
memset(a,0,sizeof(a));
memset(mp,true,sizeof(mp));
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j){
cin>>a[i][j];
if(a[i][j]=='S'){
s.y=j;
s.x=i;
}
if(a[i][j]=='*')
mp[i][j]=false;//读入的时候进行标记
}
q.push(s);
mp[s.x][s.y]=false;
while(!q.empty())
{
Node b=q.front();
q.pop();
int x=b.x,y=b.y;
if(b.step>t)
continue;
if(a[x][y]=='P'){
ans=true;
break;
}
for(int i=0;i<4;++i){
x=b.x,y=b.y;
x+=f[i][0];
y+=f[i][1];
if(x>0&&x<=m&&y>0&&y<=n)
if(mp[x][y]){
cout<<b.x<<" "<<b.y<<" "<<b.step<<endl;
Node c;
c.x=x;
c.y=y;
c.step=b.step+1;
mp[x][y]=false;//要提前标记,不然会陷入死循环
q.push(c);
}
}
}
if(ans)
cout<<"YES\n";
else
cout<<"NO\n";
}
return 0;
}