1215 迷宫

1215 迷宫

 搜索板子

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
题目描述 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
 

分类标签 Tags 

bfs

#include<cstdio>
#include<iostream>
using namespace std;
char map[22][22];int t,n;
void bfs(int i,int j){
    if(map[i+1][j]=='.'){
       map[i+1][j]='#';
       bfs(i+1,j);
    }
    if(map[i][j+1]=='.'){
       map[i][j+1]='#';
       bfs(i,j+1);
    }
    if(map[i-1][j]=='.'){
       map[i-1][j]='#';
       bfs(i-1,j);
    }
    if(map[i][j-1]=='.'){
       map[i][j-1]='#';
       bfs(i+1,j);
    }
    return ;
}
int main(){
    //ios::sync_with_stdio(false);
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                cin>>map[i][j];
        map[n][n]='.';
        bfs(1,1);
        printf("%s\n",map[n][n]=='#'?"YES":"NO");
    }
    return 0;
}

 

 dfs

#include<cstdio>
char a[1001][1001];
int dx[5]={0,0,0,-1,1},vis[1001][1001];
int dy[5]={0,-1,1,0,0};int n,t,ans=0;
void dfs(int i,int j)
{
    if(i<=0||i>n||j<=0||j>n)return ;
    if(vis[i][j]==1||a[i][j]=='#')return ;
    if(a[i][j]=='e'){
       ans=a[i][j];
       printf("YES");    
    }
    vis[i][j]=1;
    for(int x=1;x<=4;x++)
       dfs(i+dx[x],j+dy[x]);
}
int main()
{
   scanf("%d",&t);
   while(t--){
       scanf("%d\n",&n);
       for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++){
             if(j<n)
                scanf("%c",&a[i][j]);
             else 
                scanf("%c\n",&a[i][j]);
       }
       dfs(1,1);
       if(!ans)printf("NO");
       printf("\n");
   }
   return 0;
}

 

posted @ 2016-05-22 21:42  神犇(shenben)  阅读(1763)  评论(0编辑  收藏  举报