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

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

相关文章

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

MySQL 复合查询案例详解

《MySQL复合查询案例详解》:本文主要介绍MySQL复合查询案例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录基本查询回顾多表笛卡尔积子查询与where子查询多行子查询多列子查询子查询与from总结合并查询(不太重要)union基本查询回顾查询