【数据结构与算法之图结构】案例

2023-11-27 00:10

本文主要是介绍【数据结构与算法之图结构】案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【数据结构与算法之图结构】案例

文章目录

      • 【数据结构与算法之图结构】案例
          • 1 迷宫问题

1 迷宫问题

如图所示为一个环形迷宫,S 为迷宫入口,E为迷宫出口,给出该迷宫的走法。

在这里插入图片描述

我们可以将迷宫的起点、分岔路口、阻挡道路的墙壁都抽象为图中顶点、迷宫路径抽象为图中的边,那么一个迷宫就相当于一个无向图。

最后我们要做的就是找出顶点S 到顶点E的通路。

注意是通路而不是路径,通路允许包含重复的顶点。

Java代码算法实现:

import java.util.ArrayList;/*** @Projectname: JavaData_StructureAndAlgorithm* @Classname: Maze* @Author: Ding Jiaxiong* @Data:2023/3/13 19:28*/public class Maze {private VNode[] vNodes;int[] visited;ArrayList<Character> res;public void createMaze(char v[], int arc[]) {vNodes = new VNode[v.length];res = new ArrayList<Character>();for (int i = 0; i < v.length; i++) {vNodes[i] = new VNode();vNodes[i].data = v[i];vNodes[i].firstArc = null;}int index = 0;ArcNode p, q = null;for (int i = 0; i < v.length; i++) {for (; index < arc.length && arc[index] != -1; index++) {p = new ArcNode(arc[index]);if (vNodes[i].firstArc == null) {vNodes[i].firstArc = p;} else {q.next = p;}q = p;}index++;}}// 寻找一条行走迷宫的路径public void findPath() {visited = new int[vNodes.length];for (int i = 0; i < vNodes.length; i++) {visited[i] = 0;}res = new ArrayList<Character>(); // 保存结果序列for (int i = 0; i < vNodes.length; i++) {if (vNodes[i].data == 'S') {DFS(i);  // 从入口S进入迷宫深搜}}System.out.println(res);}private boolean DFS(int vIndex) {if (visit(vIndex)) {return true;}visited[vIndex] = 1;int w = getFirstAdj(vIndex);while (w != -1) {if (visited[w] == 0) {if (DFS(w)) {return true;}res.add(vNodes[vIndex].data);}w = getNextAdj(vIndex, w);}return false;}private boolean visit(int vIndex) {res.add(vNodes[vIndex].data);if (vNodes[vIndex].data == 'E') {return true;}return false;}private int getFirstAdj(int vIndex) {if (vNodes[vIndex].firstArc != null) {return vNodes[vIndex].firstArc.adjvex;}return -1;}private int getNextAdj(int vIndex, int w) {ArcNode p;p = vNodes[vIndex].firstArc;while (p != null) {if (p.adjvex == w && p.next != null) {return p.next.adjvex;}p = p.next;}return -1;}public static void main(String[] args) {char[] v = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'S'};int[] arc = {1, 3, 7, -1, 0, -1, 4, -1, 0, 4, 5, -1, 2, 3, -1, 3, -1, 7, -1, 0, 6, -1};Maze maze = new Maze();maze.createMaze(v, arc);maze.findPath();}}// 顶点类型
class VNode {char data; // 数据信息ArcNode firstArc; // 指向单链表, 即指向该顶点的第1条边}// 边节点类型
class ArcNode {int adjvex; // 该边指向的顶点在数组中的位置(数组下标)ArcNode next; // 指向下一条边的指针ArcNode(int adjvex) {this.adjvex = adjvex;}
}

运行结果

在这里插入图片描述

这篇关于【数据结构与算法之图结构】案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/426554

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长