3. 迷宫问题

一.题干

        迷宫有一个入口,一个出口。一个人从入口走进迷宫,目标是找到出口。阴影部分和迷宫的外框为墙,每一步走一格,每格有四个可走的方向,探索顺序为地图方向:南(下)、东(右)、北(上)、西(左)。

        输入:输入迷宫数组。第一行数据表示一个 n*n (n<=100)的迷宫;第二行开始的n行为迷宫数据。

        其中:0表示路,1表示墙,起点在左上角 <1,1> 的位置,终点在右下角 <n,n> 的位置。

        输出:若有解,输出从入口到出口的一条路径,否则输出 there is no solution!

                                                
        例(上图所示的迷宫数组)

        输入:

        4 4
        0 0 1 0
        0 1 0 1
        0 0 0 0
        0 1 0 0

        输出:<1,1> <2,1> <3,1> <3,2> <3,3> <4,3> <4,4>

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 4 4↵
  2. 0 0 1 0↵
  3. 0 1 0 1↵
  4. 0 0 0 0↵
  5. 0 1 0 0↵
以文本方式显示
  1. <1,1> <2,1> <3,1> <3,2> <3,3> <4,3> <4,4> ↵
1秒64M0
测试用例 2以文本方式显示
  1. 4 4↵
  2. 0 0 1 0↵
  3. 1 0 1 1↵
  4. 0 0 0 1↵
  5. 0 1 0 1↵
以文本方式显示
  1. There is no solution!↵
1秒64M0

 二.题目分析

        我们知道,迷宫问题其实就是连通图的遍历。那么显然地,可以使用BFS;采用BFS的话有个好处,第一条即为最短路径,按照出题人的想法应该就是采用BFS。试一下 

        很好,要用DFS,没要求最短,好好好,这么写,就是想考一下DFS是吧(气急败坏了已经)

三,代码如下:

        (使用的递推实现的DFS,也可以用递归,形式上更为简洁)

#include <iostream>
#include <stack>
using namespace std;
struct Point
{int col;int row;Point(int r, int c) : row(r), col(c) {}bool operator!=(const Point &p) const{return this->row != p.row || this->col != p.col;}
};
Point getNVnode(bool **mark, Point p, int m, int n)
{if (p.row + 1 < m && !mark[p.row + 1][p.col]) // 下return Point(p.row + 1, p.col);if (p.col + 1 < n && !mark[p.row][p.col + 1]) // 右return Point(p.row, p.col + 1);if (p.row - 1 >= 0 && !mark[p.row - 1][p.col]) // 上return Point(p.row - 1, p.col);if (p.col - 1 >= 0 && !mark[p.row][p.col - 1]) // 左return Point(p.row, p.col - 1);return Point(-1, -1);
}
void DFSpath(void *maze, int m, int n, const Point &startP, Point endP, stack<Point> &pointStack)
{int **maze2d = new int *[m];for (int i = 0; i < m; ++i)maze2d[i] = (int *)maze + i * n;bool **mark = new bool *[m];for (int i = 0; i < m; ++i){mark[i] = new bool[n];for (int j = 0; j < n; ++j)mark[i][j] = *((int *)maze + i * n + j);}pointStack.push(startP);mark[startP.row][startP.col] = true;while (pointStack.empty() == false && pointStack.top() != endP){Point NextP = getNVnode(mark, pointStack.top(), m, n);if (NextP.row == -1){pointStack.pop();continue;}mark[NextP.row][NextP.col] = true;pointStack.push(NextP);}
}int main()
{int N;cin >> N >> N;if (N == 1)printf("<1,1> \n");int maze[N][N];for (int i = 0; i < N; ++i)for (int j = 0; j < N; ++j)cin >> maze[i][j];Point startP(0, 0);Point endP(N - 1, N - 1);stack<Point> pointStack;DFSpath(maze, N, N, startP, endP, pointStack);if (pointStack.empty() == true)cout << "There is no solution!" << endl;else{stack<Point> tmpStack;while (pointStack.empty() == false){tmpStack.push(pointStack.top());pointStack.pop();}while (tmpStack.empty() == false){cout<<"<"<<tmpStack.top().row+1<<" "<<tmpStack.top().col+1<<"> ";tmpStack.pop();}cout << endl;}
}

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

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

相关文章

【Qt】之QSet使用

描述 QSet类是一个模板类&#xff0c;它提供基于散列表的集合。 QSet是Qt的通用容器类之一。它以未指定的顺序存储值&#xff0c;并提供非常快速的值查找。在内部,QSet是作为QHash实现的。 下面是一个带有QString值的QSet示例: QSet<QString> set;插入方式1&#xff…

Java学习路线第二篇:Java Web

这篇则分享Java学习路线第二part&#xff1a;Java Web 恭喜你已经成功追到第二章节啦&#xff0c;要被自己的努力感动到了吧&#xff0c;而这节将承担起学完Java web 的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 HTMLCSSJavaScript(JS) 【动…

MySQL 高可用架构

MySQL 是实际生产中最常用的数据库&#xff0c;生产环境数据量极为庞大&#xff0c;对性能和安全要求很高&#xff0c;单机的 MySQL 是远远达不到的&#xff0c;所以必须搭建一个主从复制架构&#xff0c;同时可以基于一些工具实现高可用架构&#xff0c;在此基础上&#xff0c…

富富集网络图绘制教程

本期教程 前言 今天学习aPEAR包&#xff0c;绘制KEGG和GO功能富集网络图&#xff0c;用起来还是比较方便的&#xff0c;直接将clusterProfiler富集结果进行绘制&#xff0c;对人类、动物等分析结果非常方便。对于模式植物&#xff0c;使用自己制作的GO或KEGG背景文件进行富集分…

Modbus平台:协议中间件(支持Modbus TCP、RTU、ASCII)

该程序可放置外网中&#xff0c;适用于DTU长连接&#xff08;心跳包必须包含DTU&#xff0c;可以是tcp/udp&#xff09;&#xff0c;也可以在内网中&#xff0c;短连接访问设备server 支持协议&#xff1a;Modbus TCP | RTU | ASCII 连接方式&#xff1a;TcpAtive: TCP主动 | …

嵌入式常见协议---IIC协议

1.IIC&#xff08;IC&#xff09;协议是什么&#xff1f; 全称 Inter-Integrated Circuit ,字面意思是集成电路之间&#xff0c;是IC BUS简称&#xff0c;中文应该叫集成电路总线&#xff0c;是一种串行通信总线&#xff08;同步串行半双工&#xff09;&#xff0c;使用多主从…

给csgo游戏搬砖新手的十大建议

1、不要参与赌博性质的开箱和炼金&#xff0c;因为真的会上瘾&#xff0c;赚了还好&#xff0c;亏了你得哭。 2、实在想要玩饰品&#xff0c;直接去悠悠有品或者网易buff看价格&#xff0c;底价再砍10元&#xff0c;总会有人愿意卖的。 3、在steam上不要接受陌生人的好友申请…

MidJourney笔记(4)-settings

前面已经大概介绍了MidJourney的基础知识,后面我主要是基于实操来分享自己的笔记。可能内容顺序会有点乱,请大家理解。 这次主要是想讲讲settings这个命令。我们只需在控制台输入/settings,然后回车,就可以执行这个命令。 (2023年11月26日版本界面) 可能有些朋友出来的界…

leetcode:有效的括号

题目描述 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目分析 题目给了我们三种括号&#xff1a;&#xff08;&#xff09;、{ }、[ ] 这里的匹配包括&#xff1a;顺序匹配和数量匹配 最优的思路就是用栈来解决&#xff1a; 括号依次入栈…

01 项目架构

关于我 曾经就职于蚂蚁金服&#xff0c;多年的后端开发经验&#xff0c;对微服务、架构这块研究颇深&#xff0c;同时也是一名热衷于技术分享、拥抱开源技术的博主。 个人技术公众号&#xff1a;码猿技术专栏个人博客&#xff1a;www.java-family.cn 前期一直在更新《Spring…

OCR文字识别工具 Cisdem OCRWizard激活最新 for Mac

为了提高内容识别的准确性&#xff0c;Cisdem OCRWizard提供供您选择两种模式&#xff1a;文件或名片。此外&#xff0c;它会自动分析的内容&#xff0c;标志着不同颜色的页面上几个区域根据给定部分的性质&#xff1a;文本&#xff08;绿色标记&#xff09;&#xff0c;图像&a…

干货分享 | TSMaster采样点配置方法与消除错误帧流程

当通讯节点间采样点参数和波特率参数不匹配造成一些错误帧时&#xff0c;我们如何在TSMaster中设置以及调整波特率参数和采样点参数&#xff0c;来减少以及消除总线上出现的错误帧&#xff0c;进一步提高通信质量。本文着重讲解讲解如何借用TSmaster更加便捷地获取相应的采样点…

SpringBoot 入门学习

开发环境配置 JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2 框架介绍 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置…

QT QComBox实现模糊查询

一、概述 在Qt中&#xff0c;可以通过QComboBox和QLineEdit实现模糊查询的功能。模糊查询是指根据用户输入的文本&#xff0c;在下拉框的选项中进行模糊匹配&#xff0c;并动态地显示匹配的选项。 二、基础知识 1、QCompleter (1)QCompleter 是 Qt 框架中提供的一个用于自动…

JOSEF 漏电继电器JHOK-ZBL1 DH-50L 系统1140V 电源AC220V

系列型号&#xff1a; JHOK-ZBL多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL1多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL2多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBM多档切换式漏电&#xff08;剩余&#xff09;继电器 …

【Java Spring】SpringBoot 五大类注解

文章目录 Spring Boot 注解简介1、五大类注解的作用2、五大类注解的关系3、通过注解获取对象4、获取Bean对象名规则解析 Spring Boot 注解简介 Spring Boot的核心就是注解。Spring Boot通过各种组合注解&#xff0c;极大地简化了Spring项目的搭建和开发。五大类注解是Spring B…

老师怎样处理校园欺凌

校园欺凌是一个让人痛心又不可忽视的问题。作为老师&#xff0c;该如何处理这种问题&#xff0c;既能够保护受欺凌的学生&#xff0c;又能够让施暴者得到应有的教训呢&#xff1f; 及时发现并介入 经常关注学生的动态&#xff0c;一旦发现有校园欺凌的苗头&#xff0c;就要及时…

pytorch读取tiny-imagenet-200的验证集(val)

ori_train torchvision.datasets.ImageFolder(root args.datadir /tiny-imagenet-200/train/, transformtransform)#可以获取class_idx的映射class_idx ori_train.class_to_idx val_annotations.txt中存储着每个图片对应的类别 获取验证集的标签 test_target []#读取val_…

python项目报错

解决办法&#xff1a;不要用配置的镜像脚本&#xff0c;直接用此命令 pip install pandas -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

Java第二十章多线程

线程简介 在 Java 中&#xff0c;并发机制非常重要。在以往的程序设计中&#xff0c;我们都是一个任务完成后再进行下一个任务&#xff0c;这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一…