题面:
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";elsecout<<"NO\n";}return 0;
}