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

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

相关文章

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第