您的位置:首页 > 其它

1215 迷宫

2017-04-02 09:56 218 查看

题目描述 Description

在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。

输入描述 Input Description

输入的第一行为一个整数m,表示迷宫的数量。 
其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。

输出描述 Output Description

输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO。

样例输入 Sample Input

1
7
s...##.
.#.....
.......
..#....
..#...#
###...#
......e


样例输出 Sample Output

YES


数据范围及提示 Data Size & Hint
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
char map[16][16]={0};
int vis[16][16]={0};
int n;
int x1,y1,x2,y2;
int tt=0;
int dir[4][2]={-1,0,1,0,0,-1,0,1};//四个方向
typedef struct node
{
int x,y;
}No;
queue<node>Q;
void bfs()
{
int i,s,t;
No a={x1,y1};
Q.push(a);//将可以走的方格差入队列
vis[x1][y1]=1;//标记已走
while(!Q.empty())
{
a=Q.front();
if(a.x ==x2 && a.y == y2)
{
tt=1;
printf("YES\n");//找到出口
return;
}
Q.pop();//取出第一个元素
for(i=0;i<4;i++)
{
s=a.x+dir[i][0];
t=a.y+dir[i][1];
if(s>=0 && s<n && t>=0 &&t<n && !vis[s][t] &&(map[s][t]=='.'||map[s][t]=='e'))//符合可以走的条件
{
No a1={s,t};
Q.push(a1);//差入队列
vis[s][t] =1;
}
}
}

}
int main()
{
int xn;
scanf("%d", &xn);
while(xn--)
{
tt=0;
scanf("%d", &n);
for(int i=0;i<n;i++)
scanf("%s", map[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='s')
x1=i,y1=j;
if(map[i][j]=='e')
x2=i,y2=j;
}
}

bfs();
if(tt==0)
printf("NO\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: