1215 迷宫

来源:互联网 发布:天刀数据加载失败 编辑:程序博客网 时间:2024/06/05 21:52

题目描述 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");}} 

0 0
原创粉丝点击