广度优先搜索 简单举例(maze)

maze

Time Limit:1000MS  Memory Limit:65536K
Total Submit:290 Accepted:103

Description

500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。

突然有一天,Jesse心爱的公主被魔王抓走,并困在了一个巨大的迷宫中。Jesse听到这个消息,非常紧张。他知道公主在迷宫中还能坚持T个小时,他急忙赶到迷宫,开始到处寻找公主的下落。

Jesse会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能在所剩的时间内找到心爱的公主。

Input

题目包括多组测试数据。
每组测试数据以三个整数N,M,T(00)开头,分别代表迷宫的长和高,以及公主能坚持的小时数。
紧接着有M行,N列字符,由".","*","P","S"组成。
其中
"." 代表能够行走的空地。
"*" 代表墙壁,Jesse不能从此通过。
"P" 是公主所在的位置。
"S" 是Jesse的起始位置。
每次Jesse只能选择“上、下、左、右”任意一个方向走一步。 每走一步花费1个小时。
输入以0 0 0结束。

Output

如果能在规定时间内救出公主输出“YES”,否则输出“NO”。

Sample Input

4 4 10
....
....
....
S**P
0 0 0

 

Sample Output

YES

 

Hint

测试样例中,王子从S点,上 右 右 右 下,一共花了五个小时刚好找到公主所在的P点

Source

代码如下:

#include "iostream" using namespace std; char map[1011][1011]; //地图数组 int res[1011][1011]; //步数数组,每个元素代表走到该点需要的步数 struct point //队列,由于是二维地图,所以队列有两个元素 横纵坐标 { int x,y; }r[1011]; int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //四个遍历方向 int main() { int i,j,n,m,time,max; int si,sj,pi,pj,head,tail,x1,y1; while(scanf("%d%d%d",&m,&n,&time)!=EOF&&n||m||time) { for(i=0; i<=m+1; i++) map[0][i]=map[n+1][i]='*'; for(i=0; i<=n+1; i++) map[i][0]=map[i][m+1]='*'; for(i=1; i<=n; i++) //初始化一个边框 for(j=1; j<=m; j++) { cin>>map[i][j]; res[i][j]=-1; if(map[i][j]=='S') { si=i, sj=j; res[i][j]=0; } if(map[i][j]=='P') pi=i, pj=j; } r[0].x=si,r[0].y=sj; tail=1, head=0; while(tail != head) { x1=r[head].x,y1=r[head].y; for(i=0; i<4; i++) { x1+=dis[i][0], y1+=dis[i][1]; if((map[x1][y1]=='.'|| map[x1][y1]=='P')&& res[x1][y1]==-1) //满足条件,则该点入队列 { r[tail].x=x1; r[tail].y=y1; res[x1][y1] = 1 + res[x1-dis[i][0]][y1-dis[i][1]]; tail++; } x1-=dis[i][0], y1-=dis[i][1]; } head++; } for(i=1; i<=n; i++) { for(j=1; j<=m; j++) cout<<res[i][j]<<" "; cout<<endl; } if(res[pi][pj]<=time && res[pi][pj]!=-1) printf("YES/n"); else printf("NO/n"); } system("pause"); return 0; } /*广度优先搜索的基本思想是: (1)从图中某个顶点V0出发,首先访问V0。 (2)依次访问V0的各个未被访问的邻节点。 (3)分别从这些邻节点出发,依次访问它们的各个未被访问的邻节点 */

你可能感兴趣的:(struct,测试,System,input,iostream,output)