[深度优先搜索DFS]迷宫问题

描述

定义一个二维数组:

int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

输入

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

输出

左上角到右下角的最短路径,格式如样例所示。

样例输入

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

样例输出

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
解题分析

这道题如果只是要得到答案的话其实并不难,困难的点在于我们必须要记住我们选择的路径并且依次输出,这就需要额外的两个path数组,一个用来记录当前我们走的路径,一个用来存储最优路径,最后输出最优路径答案即可。 由于整个题目的数量级非常的小,所以DFS或者BFS都是可以解决问题的。

代码演示
#include <iostream>
using namespace std;int maze[5][5];
bool visited[5][5]={0};struct Node{int x,y;
};Node path[25];
Node bestpath[25];int minlen=1<<30;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int depth=0;void dfs(int x,int y){if(depth>minlen) return;if(x==4 && y==4){path[depth]={x,y};if(depth<minlen){minlen=depth;for(int i=0;i<=minlen;i++){bestpath[i]=path[i];}}}path[depth]={x,y};depth++;visited[x][y]=1;for(int i=0;i<4;i++){int x1=x+dx[i],y1=y+dy[i];if(x1>=0 && x1<5 && y1>=0 && y1<5 && maze[x1][y1]==0 && !visited[x1][y1]){dfs(x1,y1);}}visited[x][y]=0;depth--;
}int main(){for(int i=0;i<5;i++)for(int j=0;j<5;j++){scanf("%d",&maze[i][j]);}dfs(0,0);for(int i=0;i<=minlen;i++){printf("(%d, %d)\n",bestpath[i].x,bestpath[i].y);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus入门

Prometheus入门 Setup Reference:https://prometheus.io/docs/introduction/overview/ exporters:你可以部署在你想要获取metrics的应用旁&#xff0c;接收Prometheus请求&#xff0c;从应用程序中收集数据并转换为正确的格式&#xff0c;最后返回给Prometheus;Service Dis…

创建百度百科词条要多少钱?看这篇

“百度百科词条人人可编辑&#xff0c;词条创建和修改均为免费&#xff0c;不存在官方及代理商付费代编。” 是的&#xff0c;百度百科免费开放&#xff0c;任何人都可以自己做&#xff0c;但是作为一个给上百家企业和个人创建百度百科词条的专业人士来说&#xff0c;给大家一…

面试题——RabbitMQ

★1.如何保证消息的幂等性&#xff1f;&#xff08;如何避免消息重复投递&#xff09; 生产端: 在消息发送前&#xff0c;先查询数据库此消息是否被处理过。处理过则忽略、否则继续处理&#xff0c;并在处理完成后修改状态为已处理。 消费端: 每个消息都生成全局唯一ID或业务I…

模型预测控制MPC详解(附带案例实现)

模型预测控制MPC详解&#xff08;附带案例实现&#xff09; 文章目录 模型预测控制MPC详解&#xff08;附带案例实现&#xff09;1. 最优控制问题2. 什么是MPC3. 二次规划Quadratic Programming4. MPC为什么可以转换成QP问题&#xff08;推导过程&#xff09;5. MPC总结5.1 MPC…

QT中QSettings的使用系列之四:QSettings与操作QJson(registerFormat())

1、核心代码 #include "widget.h" #include "ui_widget.h" #include <QSettings> #include <QJsonObject> #include <

基于51单片机的篮球计分器设计

一.硬件方案 本设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统。该系统具有赛程定时设置、赛程时间暂停、及时刷新甲乙双方的成绩等功能。 电路主要由STC89C52单片机最小系统数码管显示模块数码管驱动模块蜂鸣器模块按键模块&#xff1b; 二.设计功能 &…

哔哩哔哩视频URL解析原理

哔哩哔哩视频URL解析原理 视频网址解析视频的原理通常涉及以下几个步骤&#xff1a; 1、获取视频页面源代码&#xff1a;通过HTTP请求获取视频所在网页的HTML源代码。这一步通常需要处理反爬虫机制&#xff0c;如验证码或用户登录。 2、解析页面源代码&#xff1a;分析HTML源代…

064、Python 可变参数和关键字参数

在编写函数时&#xff0c;我们可能会存在不确定传入参数数量的情况。那么我们可以使用可变数量的参数。函数中可变数量的参数包括可变参数和关键字参数。 1、可变参数&#xff08;*args&#xff09;&#xff1a; 可变参数允许函数接受任意数量的位置参数。在函数定义中&#…

Transformer学习理解

1.前言 本文介绍当下人工智能领域的基石与核心结构模型——Transformer&#xff0c;为什么说它是基石&#xff0c;因为以ChatGPT为代表的聊 天机器人以及各种有望通向AGI&#xff08;通用人工智能&#xff09;的道路上均在采用的Transformer。 Transformer也是当下NLP任…

java设计原则

1、开闭原则 定义&#xff1a;类&#xff0c;模块&#xff0c;函数对扩展开放对修改关闭。如工厂模式 对扩展开放&#xff1a;模块对扩展开放就意味着&#xff0c;当需求变化时&#xff0c;可以对模块进行扩展&#xff0c;使其满足具有新需求的功能&#xff0c;换句话说就是模…

让我们拯救数学

一&#xff0c; 前言 数学特别是数论面临生死存亡&#xff0c;100年的数论在错误的道路上运行&#xff0c;已经把整个数学颠覆。从挪威数学家v布龙&#xff0c;到意大利数学家邦别里&#xff0c;再到德国数学家法尔廷斯&#xff0c;英国数学家安德鲁怀尔斯&#xff0c;以及中国…

【上海交大】博士生年度进展报告模板

上海交通大学 博士生年度进展报告模板 比较不好找&#xff0c;在交我办中发起申请流程后才能看到链接&#xff0c;链接如下&#xff1a; https://www.gs.sjtu.edu.cn/xzzx/pygl/15

爬取CSDN博文到本地(包含图片,标签等信息)

文章目录 csdnToMD改进将CSDN文章转化为Markdown文档那有什么办法快速得到md文档&#xff1f;例如&#xff1a;获取单个文章markdown获取所有的文章markdown 项目中待解决的问题 csdnToMD 项目原作者&#xff1a;https://gitee.com/liushili888/csdn-is—mark-down 改进后仓库…

vue脚手架 项目打包

目录 01 在脚手架中使用jquery 02 项目的打包 03 ELement UI 框架 01 在脚手架中使用jquery 脚手架中使用jquery的步骤: 1.npm i jquery --save 2.在使用jq的组件里面引入jq 3.import $ from jquery 4.正常使用 02 项目的打包 1.npm run build 项目启动不启动都可以打包 2.…

爬虫补环境,ES6 Class在环境模拟中的应用与优势

相比于使用传统的Object实现补环境框架结构&#xff0c;使用 ES6 的 Class 具有以下优势&#xff1a; 代码维护更方便&#xff1a;Class的语法更简洁直观&#xff0c;方便开发者阅读和维护。组织结构更清晰&#xff1a;Class提供了明确的层次结构&#xff0c;有助于代码的模块…

Z语言学习——基于通讯案例

目录 1数据类型 2初始状态 3 Alice的消息发送 4 Bob接收与发送消息 5 Alice接收消息 6消息的增删改查 6.1 删除消息 6.2查询消息 6.3修改/增加消息 7定理证明——重要目的 案例背景&#xff1a; (1)构建一个交互式的通讯方案&#xff1b; (2)攻击者控制了所有的通讯…

tsf-consul的使用

在腾讯云微服务平台TSF中使用Consul作为服务发现组件,通常需要遵循以下步骤: ### 1. 创建应用 首先,您需要在TSF控制台创建一个应用。在创建应用时,选择合适的业务类型、开发语言、开发框架等信息。对于使用Consul作为服务发现组件的Spring Cloud应用,您需要选择“业务应…

眼见不一定为实之MySQL中的不可见字符

目录 前言 一、问题的由来 1、需求背景 2、数据表结构 二、定位问题 1、初步的问题 2、编码是否有问题 3、依然回到字符本身 三、深入字符本身 1、回归本质 2、数据库解决之道 3、代码层解决 四、总结 前言 在开始今天的博客内容之前&#xff0c;正在看博客的您先来…

Element-UI实现el-dialog弹框拖拽功能

在实际开发中&#xff0c;会发现有些系统&#xff0c;弹框是可以在浏览器的可见区域自由拖拽的&#xff0c;这极大方便用户的操作。但在查看Element-UI中弹框&#xff08;el-dialog&#xff09;组件的文档时&#xff0c;发现并未实现这一功能。不过也无须担心&#xff0c;vue中…

在uniapp+vue cli中使用lime-echart图表,关于使用异步数据_lime-echartuniapp

import {TitleComponent,TooltipComponent,GridComponent, DatasetComponent, TransformComponent, LegendComponent } from ‘echarts/components’; // 标签自动布局&#xff0c;全局过渡动画等特性 import {LabelLayout,UniversalTransition} from ‘echarts/features’; //…