给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍问题

2024年寒假算法班集训day08-知识总结及题解(深搜上) 迷宫是一个 (N \times N) 的方格,其中“0”表示可以通行的格子,“1”表示不可通行的障碍,“2”表示宝藏的位置。程序会遍历每一个格子,如果是感染区域(即非 (0) 的格子),就进行深度优先搜索,将整个感染区域标记为已访问(即将所有连通的非 (0) 数字改为 (0)),然后感染区域的计数增加 (1)。题目描述了一个迷宫探险问题,迷宫由 ( n \times n ) 的格点组成,每个格点要么是可通行的(表示为“.”),要么是不可通行的(表示为“#”)。最后,输出这些字符串中最长的一个的长度。 阅读详情

题目描述

给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。

输入描述:

每个输入包含 1 个测试用例。每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示地牢的长和宽。接下来的 n 行,每行 m 个字符,描述地牢,地牢将至少包含两个 '.'。接下来的一行,包含两个整数 x0, y0,表示牛牛的出发位置(0 <= x0 < n, 0 <= y0 < m,左上角的坐标为 (0, 0),出发位置一定是 '.')。之后的一行包含一个整数 k(0 < k <= 50)表示牛牛合法的步长数,接下来的 k 行,每行两个整数 dx, dy 表示每次可选择移动的行和列步长(-50 <= dx, dy <= 50)

输出描述:

输出一行一个数字表示最坏情况下需要多少次移动可以离开地牢,如果永远无法离开,输出 -1。以下测试用例中,牛牛可以上下左右移动,在所有可通行的位置.上,地牢出口如果被设置在右下角,牛牛想离开需要移动的次数最多,为3次。

示例1

输入

3 3
...
...
...
0 1
4
1 0
0 1
-1 0
0 -1

输出

3

我的代码:(只通过20%测试用例,暂时没头绪,留以后再回头看看,与下面大神代码比较,个人觉得问题可能出在大神node的step上,它相当于每个node有自己的step,而我的ans是一个公共的steps!)

#include<iostream>
#include<queue>
#include<algorithm>
#include<utility>
#include<memory.h>
using namespace std;
typedef pair<int,int> pairs;
const int N=110;
int n,m,x,k,y,steps;
char s[N][N];//这样直接将变量定义成全局的方法很好
int dx[N],dy[N],visited[N][N];
void BFS();
int main(){
     while(scanf("%d%d",&n,&m)>0)
        {
        for(int i=0;i<n;i++)//字符数组的输入
            {
            scanf("%s",s[i]);
            
        }
        scanf("%d%d",&x,&y);
        scanf("%d",&k);
        for(int i=0;i<k;i++)
            scanf("%d%d",&dx[i],&dy[i]);
        BFS();
    }
    return 0;
}
bool isinside(int i,int j)
{
    return i>=0&&i<n&&j>=0&&j<m;
}
void BFS(){
    memset(visited, 0, sizeof visited);
    queue<pairs> q;
    q.push(make_pair(x,y));
    steps = -1;
    int ans = 0;
    visited[x][y]=1;
    while(!q.empty()){
        pairs cur=q.front();
        q.pop();
        for(int i =0;i<k;i++){
            x = cur.first + s[i][0];
            y = cur.second + s[i][1];
            if(!isinside(x,y))
                continue;
            if(s[x][y]=='X'||visited[x][y]==1)
                continue;
             visited[x][y]=1;
            q.push(make_pair(x,y));
            steps=max(steps,++ans);
        }
    }
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(s[i][j]=='.'&&visited[i][j]==0)
                steps =-1;
    cout<<steps<<endl;
    
}

网上大神的代码:来源 https://www.cnblogs.com/ranranblog/p/5774712.html

#include<iostream>
#include<memory.h>
#include<queue>
using namespace std;
const int N=110;
int n,m,x0,y0,k;
char s[N][N];//这样直接将变量定义成全局的方法很好
int dx[N],dy[N],visit[N][N];
struct node
{
    int x;
    int y;
    int step;
    node(){}
    node(int x,int y,int step):x(x),y(y),step(step){}
};
bool isinside(int i,int j)
{
    return i>=0&&i<n&&j>=0&&j<m;
}
void dfs(){
    memset(visit,0,sizeof visit);
    queue<node>que;
    que.push(node(x0,y0,0));
    visit[x0][y0]=1;
    int ans=-1;
    while(!que.empty())
    {
        node cur=que.front();
        que.pop();
        for(int i=0;i<k;i++)
        {
            int nx=cur.x+dx[i];
            int ny=cur.y+dy[i];
            if(!isinside(nx,ny)) 
                continue;
            if(s[nx][ny]=='X'||visit[nx][ny]==1)//每个点都进行判断是不是不能访问或者已经访问过了
                continue;
            visit[nx][ny]=1;
            que.push(node(nx,ny,cur.step+1));
            ans=max(ans,cur.step+1);
            
        }
    }
    for(int i=0;i<n;i++)
        {
        for(int j=0;j<m;j++)
         {
            if(s[i][j]=='.'&&visit[i][j]==0) ans=-1;
        }
    }
    cout<<ans<<endl;
}
int main()
{
    while(scanf("%d%d",&n,&m)>0)
        {
        for(int i=0;i<n;i++)//字符数组的输入
            {
            scanf("%s",s[i]);
            
        }
        scanf("%d%d",&x0,&y0);
        scanf("%d",&k);
        for(int i=0;i<k;i++)
            scanf("%d%d",&dx[i],&dy[i]);
        dfs();
    }
    
}

 

迷宫问题 假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为(m,n),试找出一条从入口通往出口的最短路径。设计算法并编程输出一条通过迷宫的最短路径或报告一个“无法通过”的信息。 题目:假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为(m,n),试找出一条从入口通往出口的最短路径。设计算法并编程输出一条通过迷宫的最短路径或报告一个“无法通过”的信息。 要求:用栈和队列实现,不允许使用递归算法。 立即下载

相关推荐

【胡学长 带你学 Global Mapper 】如何将影像地图转换为国家2000坐标系

多部门联合开展工作坐标数据不匹配怎么办?Hi,我是胡学长!今天教大家如何利用Global Mapper将谷歌影像数据转换为国家2000坐标系影像数据 。

一起来交流学习吧 1万+

童程童美 第十六讲(Level2)

1.1791 多少块水洼有一块 N×M 的土地,雨后积起了水,有水标记为‘W’,干燥为‘.’。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼?输入描述第一行为 N,M (1≤N,M≤100)。下面为 N×M的土地示意图。输出描述一行,共有的水洼数。样例输入 110 12样例输出 13搜索模板题(八个方向)AC代码:i

Somnus_time的博客 1965

新手也能搞定!用ADS 2023从零设计一个超宽带Wilkinson功分器(附完整版图)

本文详细介绍了如何使用ADS 2023从零开始设计超宽带Wilkinson功分器,涵盖介质板参数设置、微带线计算优化、版图生成验证等关键步骤。通过实例演示和常见问题排查,帮助射频工程新手快速掌握功分器设计技巧,提升设计效率。

weixin_42692935的博客 476

2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的障碍, ‘S‘表示这个地方有一个士兵,全

2023-03-11:给定一个N*M的二维矩阵,只由字符’O’、‘X’、‘S’、'E’组成,这不得不承认chatgpt很强大,这还是山寨版的,感觉比我自己写得还要好。士兵从初始地点行动时,不管去哪个方向,都不用耗费转向的代价,以下代码是生成的golang代码,稍微做了修改。'S’表示这个地方有一个士兵,全图保证只有一个士兵,'E’表示这个地方有一个敌人,全图保证只有一个敌人,走到相邻的可通行的平地上,走一步耗费a个时间单位,以下代码是生成的rust代码,稍微做了修改。'X’表示这个地方是不可通行的障碍,

福大大架构师每日一题 2万+

Dify 深度进阶:从入门到精通AI应用构建

《Dify进阶指南:从基础到高阶的AI应用开发技巧》 本文深入探讨Dify平台的高级功能与应用开发技巧。首先强调核心概念的深化,包括提示词工程进阶、知识库高效管理和模型参数优化。重点介绍智能体应用的开发方法,如何让AI具备自主规划与执行能力。同时讲解工作流编排、前端集成等实用技术,并分享应用运营优化、成本控制等实践经验。文章还展望了Dify生态的发展趋势,为开发者提供从基础到进阶的完整学习路径,助力打造更智能高效的AI应用。

同名公众号:dify实验室 1950

STM32MP157+AD7606BSTZ四通道IEPE传感器采集方案实战(附完整电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器采集方案,涵盖硬件电路设计、软件驱动开发及系统性能优化。通过精确的恒流源设计和同步采样技术,实现高精度振动信号采集,适用于工业振动监测等应用场景。

weixin_42713608的博客 702

c++ 迷宫搜索(宽搜)

c++ 迷宫搜索(宽搜) 题目描述 迷宫的游戏,相信大家都听过,现在我们用一个n*m的矩阵表示一个迷宫,例如: S.X. ..X. ..XD .... 其中‘S’表示起点,‘D’表示终点,‘X’表示该位置为墙,不可以走,‘.’表示可以通行。每次只能向“上下左右”四个方向移动一步。 你的任务是判断在x步内(小于等于x),能否从起点走到终点。 输入 第一行输入三个数n m x,分别表示迷宫的尺寸和步...

weixin_30911451的博客 953

SICK LMS111激光雷达数据解析实战:从原始帧到三维点云的完整流程

本文详细解析了SICK LMS111激光雷达从原始数据帧到三维点云的完整处理流程,包括数据帧结构解析、坐标转换、点云可视化及性能优化技巧。通过实战代码示例,展示了如何高效处理激光雷达数据,并应用于动态物体检测、地面分割等工业场景,为AGV和服务机器人开发者提供实用指南。

garlic的博客 769

逃离迷宫

链接:https://ac.nowcoder.com/acm/problem/15552 来源:牛客网 题目描述 给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表陷阱不能走, 'P'代表人物位置,'K'代表钥匙,'E'代表出口。人物一个,钥匙有多个, ('K'的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个 方向走一格,花费一个单位时间,现在你需要花费...

huantingyizhan的博客 927

SA8295P QNX主机上电启动流程分析

嵌入式系统的启动过程对于确保系统正常运行至关重要。本文将详细分析SA8295P芯片在QNX主机上的上电启动流程,并提供相应的源代码示例。嵌入式系统的启动过程对于确保系统正常运行至关重要。本文将详细分析SA8295P芯片在QNX主机上的上电启动流程,并提供相应的源代码示例。以下是一个SA8295P QNX主机上电启动流程分析。

CodeMaven的博客 1231

Python 爬虫实战:在房天下抓取房产信息,分析房价走势

通过本次 Python 爬虫实战,我们成功地从房天下爬取了房产信息,并进行了存储、处理、分析和可视化展示。在这个过程中,我们不仅掌握了爬虫技术的基本应用,还学会了如何对动态加载的数据进行处理和分析。然而,本次爬虫任务也存在一些局限性,例如仅爬取了部分区域的房产数据,且未对房产的图片和视频内容进行分析。在未来的工作中,我们可以进一步优化爬虫程序,爬取更多区域的房产数据,并深入分析房产的多媒体内容、用户行为模式等,为购房者和房地产从业者提供更有价值的数据支持。

u014481728的博客 1367

地牢逃脱 (BFS)

题意:给定一个 n 行 m 列的地牢,其中 ‘.’ 表示可以通行的位置,’X’ 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。我必须说:出题人是智障!! 谁能看

flyawayl的博客 694

在 SAP 中,Primary Cost Element(初级成本要素)与Secondary Cost Element(次级成本要素)的核心区别、作用及业务含义可归纳如下

摘要:SAP中初级成本要素与次级成本要素的核心区别在于:初级要素必须关联FI模块的损益科目,直接影响财务报表,用于记录外部成本(如电费、薪酬);次级要素仅存在于CO模块,用于内部成本分配(如分摊、作业分配),不影响外部报表。初级要素是"外部成本入口",次级要素是"内部成本搬运工",二者共同实现成本的多维度追踪与管理。

金牌架构师 759

网易面试题之给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步

package wangyi; /** * Created by Administrator on 2016/12/7. * 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢, * 和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍

李凯龙 3214

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

二、给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定...

给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0, y0) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。 个输入包含 1 个测...

diaorou9470的博客 293

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

网易笔试题-地牢逃脱

地牢逃脱 题目 给定一个 n 行 m 列的地牢,其中'.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从(x0,y0) 位置出发,遍历这个地牢。 和一般的游戏所不同的是,他每一步只能按照一些指定的方式遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。 地牢的出口可能在任意某个可以通行的位置上。牛牛想知道出口在最坏情况下,他最少需要多少步才可以离开这...

OrangeCat 754

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

清晰解题: 网易编程地牢逃脱

[编程题] 地牢逃脱- 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 $(x_0 , y_0 )$ 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。 输入描述

萧萧的专栏 2495

牛客网 地牢逃脱

题目:地牢逃脱 题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。 输入描...

Dan的专栏 341

地牢逃脱

给定一个 n 行 m 列的地牢,其中 ‘.’ 表示可以通行的位置,’X’ 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。输入描述每个输入包含 1 个测试用例。

qazwyc的博客 1149

2017校招真题 网易 地牢逃脱

题目描述给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。输入描述:每个输入包含 1 个测...

请赐教 295

网易_地牢逃脱 bfs广度优先搜索

网易_地牢逃脱 题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。 输入描...

横济沧海的博客 251

编程题:地牢逃脱

题目描述给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。输入描述:每个输入包含 1 个测...

灰太狼 724
上一篇: 相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大
下一篇: 使用Python快速制作可视化报表
Poo_Chai
博客等级 码龄9年 178粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poo_Chai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值