首页 > 代码库 > Hero In Maze
Hero In Maze
Hero In Maze
时间限制(普通/Java):1000MS/10000MS 运行内存限制:65536KByte
AC代码如下描述
500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。
突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。
时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T
500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。
他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。
输入
题目包括多组测试数据。
每组测试数据以三个整数N,M,T(0<n, m≤20, t>0)开头,分别代表迷宫的长和高,以及公主能坚持的天数。
紧接着有M行,N列字符,由".","*","P","S"组成。其中
"." 代表能够行走的空地。
"*" 代表墙壁,Jesse不能从此通过。
"P" 是公主所在的位置。
"S" 是Jesse的起始位置。
每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。
输入以0 0 0结束。
输出
如果能在规定时间内救出公主输出“YES”,否则输出“NO”。
样例输入
4 4 10
....
....
....
S**P
0 0 0
....
....
....
S**P
0 0 0
样例输出
YES
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #define M 1000005 #define ll long long using namespace std; int DTx[4]={-1,0,1,0}; int DTy[4]={0,1,0,-1}; char map[25][25]; int dp[25][25]; int x,y,X,Y; int minn; int n,m,t; struct H{ int x,y; int time; }; int bfs(int h,int z) { int i,j; queue <H> q; H a,b,c; a.x=h; a.y=z; a.time=0; q.push(a); while(!q.empty()) { b=q.front(); q.pop(); if(b.x==X&&b.y==Y) return b.time; for(i=0;i<4;i++) { c.x=b.x+DTx[i]; c.y=b.y+DTy[i]; if(c.x>=0&&c.x<m&&c.y>=0&&c.y<n&&!dp[c.x][c.y]) { dp[c.x][c.y]=1; c.time=b.time+1; q.push(c); } } } return 0; } int main() { int i,j; while(~scanf("%d%d%d",&n,&m,&t)&&(n||m||t)) { memset(dp,0,sizeof dp); for(i=0;i<m;i++) cin>>map[i]; for(i=0;i<m;i++) for(j=0;j<n;j++) if(map[i][j]=='S') {x=i;y=j;dp[i][j]=1;} else if(map[i][j]=='P') {X=i;Y=j;} else if(map[i][j]=='*') dp[i][j]=1; //printf("%d %d %d %d\n",x,y,X,Y); minn=bfs(x,y); /*for(i=0;i<m;i++) { for(j=0;j<n;j++) cout<<dp[i][j]<<" "; cout<<endl; }*/ //printf("%d\n",minn); if(minn==0) { printf("NO\n"); continue; } if(minn<=t) printf("YES\n"); else printf("NO\n"); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。