1215 迷宫

本文介绍了一个N*N迷宫问题的解决方法,利用BFS(宽度优先搜索)算法判断从起点到终点是否存在路径。给出了完整的C++实现代码,并详细解释了输入输出的要求。

codevs——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

代码:

BFS 过

你只需要判断它是否能够走到n,n这个点就可以

#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 20
using namespace std;
int n,m;
char a[N][N];
bool vis[N][N],flag;
queue<int>qx;
queue<int>qy;
int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
void bfs(int x,int y)
{
    while(!qx.empty()) qx.pop();
    while(!qy.empty()) qy.pop();
    qx.push(x),qy.push(y);
    vis[x][y]=true;
    while(!qx.empty()&&!qy.empty())
    {
        int ax=qx.front(),ay=qy.front();
        qx.pop(),qy.pop();
        for(int i=0;i<4;i++)
        {
            int x1=ax+xx[i],y1=ay+yy[i];
            if(x1==n&&y1==n) 
            {
                flag=true;
                return ;
            }
            if(a[x1][y1]=='#'||vis[x1][y1]) continue;
            if(x1<1||y1<1||x1>n||y1>n) continue;
            vis[x1][y1]=true;
            qx.push(x1),qy.push(y1);
        }
    }
    if(vis[n][n]) flag=true;
}
int main()
{
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
          cin>>a[i][j];
        a[n][n]=='.';
        bfs(1,1);
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

      青春就是用拼搏交换了不起!

 

转载于:https://www.cnblogs.com/z360/p/6945557.html

Y1215 迷宫 Ai助手・P仔查看解析 提交 1233 通过 401 时间限制 1000ms 内存限制 256Mb 全屏 描述 一天 ExtenseExtense 在森林里探险的时候不小心走入了一个迷宫迷宫可以看成是由 n \times nn×n 的格点组成,每个格点只有 22 种状态,.. 和 \##,前者表示可以通行后者表示不能通行。 同时当 ExtenseExtense 处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,ExtenseExtense 想要从点 AA 走到点 BB,问在不走出迷宫的情况下能不能办到。 如果起点或者终点有一个不能通行(为 \##),则看成无法办到。 输入描述 第 11 行是测试数据的组数 kk,后面跟着 kk 组输入。每组测试数据的第 11 行是一个正整数 nn (1 \leq n \leq 100)(1≤n≤100),表示迷宫的规模是 n \times nn×n 的。接下来是一个 n \times nn×n 的矩阵,矩阵中的元素为 .. 或者 \##。再接下来一行是 44 个整数 h_ah a ​ , l_al a ​ , h_bh b ​ , l_bl b ​ ,描述 AA 处在第 h_ah a ​ 行, 第 l_al a ​ 列,BB 处在第 h_bh b ​ 行, 第 l_bl b ​ 列。注意到 h_ah a ​ , l_al a ​ , h_bh b ​ , l_bl b ​ 全部是从 00 开始计数的。 输出描述 kk 行,每行输出对应一个输入。能办到则输出 YES,否则输出 NO。 输入输出样例 输入样例 1复制 2 3 .## ..# #.. 0 0 2 2 5 ..... ###.# ..#.. ###.. ...#. 0 0 4 0 输出样例 1复制 YES NO 提示 (1 \leq n \leq 100)(1≤n≤100)
最新发布
09-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值