TOJ 1005 Hero In Maze(BFS)

Posted xmmq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TOJ 1005 Hero In Maze(BFS)相关的知识,希望对你有一定的参考价值。

描述

 

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

样例输出

 YES

 

题意

广度优先搜索bfs,如果到达天数>=所剩时间T 输出YES ,如果无法到达||可以到达但是到达天数<所剩天数则输出NO

题解

直接跑bfs,需要注意的是行列的输入以及如果跑不到终点的样例,所以输出NO要放在while外面。

代码

 1 #include"stdio.h"
 2 #include"queue"
 3 #include"string.h"
 4 using namespace std;
 5 int n,m,t,sx,sy,px,py,f;
 6 char map[25][25];
 7 int check[25][25];
 8 int dx[]={0,0,1,-1};
 9 int dy[]={1,-1,0,0};
10 struct node
11 {
12     int x,y,t;
13 };
14 void bfs()
15 {
16     int i;
17     queue<node> qu;
18     node a,b;
19     a.x=sx,a.y=sy,a.t=0;
20     qu.push(a);
21     check[sx][sy]=1;
22     while(!qu.empty())
23     {
24         a=qu.front();
25         qu.pop();
26         if(a.x==px&&a.y==py&&a.t<=t)
27         {
28             printf("YES
");
29             f=0;
30             break;
31         }
32         for(i=0;i<4;i++)
33         {
34             b=a;
35             b.x+=dx[i];
36             b.y+=dy[i];
37             if(map[b.x][b.y]==*)
38                 continue;
39             if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&check[b.x][b.y]==0)
40             {
41                 b.t++;
42                 check[b.x][b.y]=1;
43                 qu.push(b);
44             }
45         }
46     }
47     if(f)
48         printf("NO
");
49 }
50 int main()
51 {
52     int i,j;
53     while(scanf("%d %d %d",&m,&n,&t),n+m+t)
54     {
55         f=1;
56         memset(check,0,sizeof check);
57         for(i=0;i<n;i++)
58             scanf("%s",map[i]);
59         for(i=0;i<n;i++)
60             for(j=0;j<m;j++)
61             {
62                 if(map[i][j]==S){sx=i,sy=j;}
63                 if(map[i][j]==P){px=i,py=j;}
64             }
65         bfs();
66     }
67     return 0;
68 }

 



















以上是关于TOJ 1005 Hero In Maze(BFS)的主要内容,如果未能解决你的问题,请参考以下文章

AOJ 6.Hero In Maze

Hero In Maze

TOJ 3709:Number Maze(广搜记录前驱)

Borg Maze(BFS+MST)

poj 3026 Borg Maze(最小生成树+bfs)

hdu 5094 Maze bfs