NOI - OpenJudge - 2.5基本算法之搜索 - 2753:走迷宫 - 超级无敌详细题解(含多个不同算法AC代码)
点赞关注吧~
2753:走迷宫
- 查看
- 提交
- 统计
- 提问
总时间限制:
1000ms
内存限制:
65536kB
描述
一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。
输入
第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)
接下来是R行,每行C个字符,代表整个迷宫。
空地格子用'.'表示,有障碍物的格子用'#'表示。
迷宫左上角和右下角都是'.'。
输出
输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
样例输入
5 5 ..### #.... #.#.# #.#.# #.#..
样例输出
9
标准代码及题解
解题
简单的使用bfs或者dfs即可,因为R和C比较小,使用dfs也不会太消耗时间
代码
dfs
①平常做法,找时将地图某值设墙,找完后再设置路
(1)标准
#include <iostream>
using namespace std;
char map[45][45];
int R, C, ans = -1;
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void dfs(int x, int y, int step) {if (x == R - 1 && y == C - 1 && (step < ans || ans == -1)) ans = step;int xx, yy;for (int i = 0; i < 4; i++) {xx = x + dir[i][0];yy = y + dir[i][1];if (xx >= 0 && xx < R && yy >= 0 && yy < C && map[xx][yy] == '.') {map[xx][yy] = '#';dfs(xx, yy, step + 1);map[xx][yy] = '.';}}
}
int main() {cin >> R >> C;for (int i = 0; i < R; i++)for (int j = 0; j < C; j++)cin >> map[i][j];dfs(0, 0, 1);cout << ans;
}
(2)本人手写
//DFS 做法
#include <bits/stdc++.h>
using namespace std;
int r,c;//r行 c列
int maze[45][45];
int ans=-1;
int movex[4]{-1,1,0,0};//上下左右
int movey[4]{0,0,-1,1};//上下左右
void dfs(int x,int y,int step){if(x==r&&y==c&&(step<ans||ans==-1)){ans=step;}for(int i=0;i<4;i++){int X,Y;X=x+movex[i];Y=y+movey[i];if(X>0&&X<=r&&Y>0&&Y<=c&&maze[X][Y]==0){maze[X][Y]=1;dfs(X,Y,step+1);maze[X][Y]=0;}}
}
int main(){cin>>r>>c;char node;for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){cin>>node;if(node=='#'){maze[i][j]=1;}else if(node=='.'){maze[i][j]=0;}}}dfs(1,1,1);//dfs(x,y,step)cout<<ans<<endl;return 0;
}
②将路径设值,如果到某处以前到过且经过的长度较小则直接略过,进行减枝,减少递归次数
#include <iostream>
using namespace std;
int R, C, map[45][45], dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; //map记录这点经过的最短步数
void dfs(int x, int y) {int xx, yy;for (int i = 0; i < 4; i++) { //四方xx = x + dir[i][0], yy = y + dir[i][1];if (xx >= 0 && xx < R && yy >= 0 && yy < C && map[x][y] + 1 < map[xx][yy]) {map[xx][yy] = map[x][y] + 1;dfs(xx, yy);}}
}
int main() {cin >> R >> C;char temp;for (int i = 0; i < R; i++)for (int j = 0; j < C; j++) {cin >> temp;map[i][j] = (temp == '.') ? 1e9 : -1;}map[0][0] = 1;dfs(0, 0);cout << map[R - 1][C - 1]; // 步数存在了map里
}
bfs
以前总是不明白为什么bfs适合找最短路径,这次好好思考了一下,可以这样理解,
bfs是从一点出发,将其相邻的各点依次加入到队列之中,然后将其相邻的队列分别求它的相邻队列
如图所示,最外层的点无论选择何种路径,最短路径的长度是已经确定了的且相等
当遇到障碍物时它仍是一层一层的进行下去
如果目标正好在一层上,那么这层所代表的距离就是最短距离,
bfs是一层一层,一圈一圈进行下去的,如果你寻找的点正好在那一圈上最短距离也就求出了,不会存在有其它道路更短的情况,因为每一圈下去都是最短路径
比如如图
有两条路径可以到达,绿色和蓝色,其中绿色较短,蓝色较长,蓝色可能会先到蓝绿交点,但他不会把绿色的路堵住,去走上面的路,而是走绿色接下来的路,因为bfs总是去寻找最短的路,如图红色的路径。
现在表达还是有些混乱,之后再更新修补
①使用队列
#include <iostream>
#include <queue>
using namespace std;
int R, C, step[45][45], dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
char map[45][45];
int main() {cin >> R >> C;for (int i = 0; i < R; i++) cin >> map[i];queue<int> q;q.push(0 * C + 0);step[0][0] = 1;while (!q.empty()) {int x = q.front() / C, y = q.front() % C;q.pop();for (int i = 0; i < 4; i++) {int xx = x + dir[i][0], yy = y + dir[i][1];if (map[xx][yy] == '.' && !step[xx][yy]) {q.push(xx * C + yy);step[xx][yy] = step[x][y] + 1;}}}cout << step[R - 1][C - 1];
}
②数组模拟队列
把队列数组设置的长些,出队列直接前面指向加一,不必真正删除
#include <iostream>
using namespace std;
int R, C, queue[2000], step[45][45], dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
char map[45][45];
int main() {cin >> R >> C;for (int i = 0; i < R; i++) cin >> map[i];step[0][0] = 1;queue[0] = 0 * C + 0;for (int i = 0, have = 0; i <= have; i++) {int x = queue[i] / C, y = queue[i] % C;for (int j = 0; j < 4; j++) {int xx = x + dir[j][0], yy = y + dir[j][1];if (map[xx][yy] == '.' && !step[xx][yy]) {queue[++have] = xx * C + yy;step[xx][yy] = step[x][y] + 1;}}}cout << step[R - 1][C - 1];
}
相关文章:
NOI - OpenJudge - 2.5基本算法之搜索 - 2753:走迷宫 - 超级无敌详细题解(含多个不同算法AC代码)
点赞关注吧~ 2753:走迷宫 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。 给定一个迷宫,求从左上角走到右下角最…...
什么是Redis数据一致性?如何解决?
在系统中缓存最常用的策略是:服务端需要同时维护DB和cache,并且是以DB的结果为准–Cache-Aside Pattern(缓存分离模式、旁路缓存) 读数据 单纯的读数据是不会产生数据不一致,只有并发下读和写才会存在数据不一致。 写…...
【办公软件】开发常用网站
文章目录 一、开发社区二、开发学习三、视图工具四、开发工具五、前端web开发工具六、开发接口官网 备用产看。 https://www.webhub123.com https://www.webhub123.com/#/home/detail?projectHashid59183272&ownerUserid22053727 java全栈只是体系:https://www…...
车道线检测_Canny算子边缘检测_1
Canny算子边缘检测(原理) Canny算子边缘检测是一种经典的图像处理算法,由John F. Canny于1986年提出,用于精确、可靠地检测数字图像中的边缘特征。该算法设计时考虑了三个关键目标:低错误率(即尽可能多地检…...
kubadm部署kubernetes
什么是kubernetes Kubernetes是一款应用于集群的,容器自动部署、扩展和管理的开源平台,提供了一种以容器为中心的基础架构。利用kubernetes,你可以快速高效地响应客户如下请求: 应用程序的动态、精准部署应用程序的动态扩展无缝推…...
Sqlite插入单引号和双引号,防止sql注入
1. 方法1 sqlite3_mprintf替换sprintf,%q替换%s. 1.1. 举例 修改前代码 //修改前, hello123写入失败char sql[1000]char* sql sprintf("UPDATE table SET name %s WHERE name_id %d","hello123", 1);rc sqlite3_exec(db, sql, NULL, NULL, &err…...
代码随想录算法训练营第二十九天(回溯5)|491. 非递减子序列、46. 全排列、47. 全排列 II(JAVA)
文章目录 491. 非递减子序列解题思路源码 46. 全排列解题思路源码 47. 全排列 II解题思路源码 总结 491. 非递减子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 …...
【CANN训练营笔记】AscendCL图片分类应用(C++实现)
样例介绍 基于PyTorch框架的ResNet50模型,对*.jpg图片分类,输出各图片所属分类的编号、名称。 环境介绍 华为云AI1s CPU:Intel Xeon Gold 6278C CPU 2.60GHz 内存:8G NPU:Ascend 310 环境准备 下载驱动 wget ht…...
从头开发一个RISC-V的操作系统(二)RISC-V 指令集架构介绍
文章目录 前提ISA的基本介绍ISA是什么CISC vs RISCISA的宽度 RISC-V指令集RISC-V ISA的命名规范模块化的ISA通用寄存器Hart特权级别内存管理与保护异常和中断 目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提…...
uniapp/设置桌面角标/发送系统通知/动态修改桌面应用图标/展示3d模型/仿淘宝二楼
uniapp的安卓apk图标角标设置消息数量 1、主要方法: 设置角标: plus.runtime.setBadgeNumber(999) 清除角标: //plus.runtime.setBadgeNumber(0)//没有效果 plus.runtime.setBadgeNumber(-1) //有效果 2、使用在具体的生命周期 1、打开app获取…...
【Java八股学习】Redis高可用 思维导图
说明 文章内容通过学习小林Coding内的优质文章后整理而来,整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除,再次对小林Coding内的优质文章表示感谢。参考文章如下: 主从复制是怎么实现的?为什么要有哨…...
C++万物起源:类与对象(三)拷贝构造、赋值重载
目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中,我们可以将一个变量赋值给…...
JavaScript构造函数(new构造js对象与原型链prototype)
构造函数详解 铺垫:面向对象编程一、构造函数是什么?二、构造函数的作用?三、构造函数的执行过程?四、构造函数的返回值?五、构造函数为什么要用new关键字调用?六、构造函数的实例成员和静态成员࿱…...
【WPF应用31】WPF基本控件-ListView的详解与示例
WPF(Windows Presentation Foundation)是.NET框架的一个组成部分,它用于构建桌面应用程序的用户界面。ListView是WPF中一个非常强大的数据展示控件,它可以用来显示一系列的项,类似于Windows资源管理器中的文件列表。Li…...
【动态】江西省小型水库安全监测能力提升试点项目通过验收
近日,由北京国信华源科技有限公司和长江勘测规划设计研究有限责任公司联合承建的江西省小型水库安全监测能力提升试点项目圆满通过验收。 在项目业主单位的组织下,省项目部、特邀专家、县水利局二级项目部以及项目设计、监理、承建等单位的代表组成验收工…...
前视声呐目标识别定位(九)-声呐驱动
前视声呐目标识别定位(一)-基础知识 前视声呐目标识别定位(二)-目标识别定位模块 前视声呐目标识别定位(三)-部署至机器人 前视声呐目标识别定位(四)-代码解析之启动识别模块 …...
【详解】Windows系统安装Nginx及简单使用
【详解】Windows系统安装Nginx及简单使用 一、Nginx是什么? “Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡。”Nginx 是一款 http 服…...
WebGPU vs. WebGL:前端图形技术的进化与数字孪生的崭新前景
在现代互联网时代,图形渲染在网页应用和数字孪生的开发中起着至关重要的作用。WebGL和WebGPU是两种前端图形技术,它们在处理图形和计算密集型任务时发挥着关键作用。本文将深入研究这两种技术,探讨它们的区别、WebGPU的优势,以及它…...
即刻体验 | 使用 Flutter 3.19 更高效地开发
我们已隆重推出全新的 Flutter 版本——Flutter 3.19。此版本引入了专为 Gemini 设计的新 Dart SDK、一个能让开发者对 Widget 动画实现精细化控制的全新 Widget,Impeller 更新带来的渲染性能提升、有助于实现深层链接的工具和对 Windows Arm64 的支持,以…...
Exchanger 怎么用J.U.C
Exchanger简介 Exchanger通常用来解决以下类似场景的问题,如下:两个线程间需要交换数据的问题,在多线程编程中,经常会有这样的场景:两个线程各自持有一些数据,并且需要在某个点上交换这些数据,…...
校园局域网钓鱼实例
Hello ! 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全,设计的钓鱼案例也是怎么简陋怎么来 注:本文不会外传代码,后端已停止使用,仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…...
网络原理 - HTTP / HTTPS(3)——http响应
目录 一、认识 “状态码”(status code) 常见的状态码 (1)200 OK (2)404 Not Found (3)403 ForBidden (4)405 Method Not Allowed (5&…...
Flask Python:模糊查询filter和filter_by,数据库多条件查询
数据库(sqlalchemy)多条件查询 前言一、filter、filter_by实现过滤查询1、filter_by()基础查询并且查询(多条件查询) 2、filter()like:模糊查询and:并且查询or:或者查询 二、all(),first(),get(…...
leetcode 热题 100(部分)C/C++
leetcode 热题 100 双指针 盛最多水的容器 【mid】【双指针】 思路: 好久没写代码sb了,加上之前写的双指针并不多,以及有点思维定势了。我对双指针比较刻板的印象一直是两层for循环i,j,初始时i,j都位于左界附近&…...
梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码
源码简介 最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容:修复播放器接口问题,把接口本地化,但是集成外链播放器…...
如何通过Spring提供的EL表达式执行bean的属性或方法?
如何通过Spring提供的EL表达式执行bean的属性或方法? 关键两个bean: org.springframework.expression.Expression org.springframework.expression.spel.support.StandardEvaluationContext 实例: import cn.hutool.extra.spring.Spring…...
SSTI 服务器端模板注入(Server-Side Template Injection)
1.【攻防世界】Web_python_template_injection {{}}是变量包裹标识符,里面存放的是一个变量,当你输入 http://61.147.171.105:55121/{{8*8}} 执行成功,说明存在模版注入。接下来,开始想办法编代码拿到服务器的控制台权限 。 首先…...
Vue.js---------Vue基础
能够说出Vue的概念和作用能够使用vue/cli脚手架工程化开发能够熟练Vue指令 一.vue基本概念 1.学习vue Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 渐进…...
力扣经典150题第一题:合并两个有序数组
目录 合并两个有序数组问题详解与解决方法1. 介绍2. 问题描述3. 解题思路4. 算法实现5. 复杂度分析6. 测试和验证7. 扩展如何处理特殊情况和边界条件?如何处理数组中可能存在的重复元素?如何优化算法以减少内存使用或提高执行效率? 8. 总结9.…...
Git:日志修改
一、问题描述 有小伙伴提出一个需求,为了满足某种需要,需要在Git日志中增加一条提交记录,并且需要指定提交时间。 比如,以下面这个only-allow项目为例,想在它的Git日志2023/9/26 19:08:08前插入一条2023/9/28 19:08:0…...
提供免费主页空间的网站/网络口碑营销的成功案例
2、深度优先和广度优先 深度优先DFS 1、访问顶点V 2、从V的未被访问的邻接点出发,对图进行深度优先遍历; 3、直到访问到与V相通的节点; 4、若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先…...
如何把网站设为正确建设中/应用市场
欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取精品学习资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777 nor 随机存储 速率快,内存下(可以块操作) 一般用来…...
wordpress注册项/今日油价92汽油
IDEA的Maven依赖如何引入到External Libraries中 第一问题描述 对于 idea 下的 maven 工程,特别是从其他地方导入的新工程,右边 maven 管理工具中 dependencies 若出现红色波浪线。通常用以下方式尝试解决。 1、 检查 repository 和 settings.xml文件…...
哈尔滨建站哪个好/2345王牌浏览器
基础 软件项目失败的常见原因(学院派) 对客户需求理解不足造成的风险。主要包括需求变更风险,涉及风险,过程风险,安装及维护风险。 由于管理人员能力不够,经验不足,沟通不畅,任务或…...
网店设计与装修实训报告/乐陵市seo关键词优化
前言 当我们来回切换页面时候,视图被缓存下来,不用每次再去new一个新的视图,可以大大地提高性能。当跳出一个视图后,视图的元素被保存在DOM中,它的作用域也就不在$watch的作用域内,当我们访问一个已经被缓存…...
做外汇网站代理/网络营销是什么
然而并没有什么好论的。。。 直接贴代码算了。。。 ll Mul(ll x,ll y,ll Mod){x(x%ModMod)%Mod;y(y%ModMod)%Mod;return (x*y-(long long)((long double)x/Mod*y0.5)*ModMod)%Mod; } 转载于:https://www.cnblogs.com/yanshannan/p/9649887.html...