C# 根据两点名称,寻找两短路程的最优解,【有数据库设计,完整代码】

前言

如果我们遇到路径问题,可以使用点点连线,给定一个点,可以到达另外几个点,寻找最优解
例:如下图所示,如果要从A1-C1,可以有三条路

1.A1-B1-C1
2.A1-B2-C1
3.A1-B3-C1

最优解肯定是A1-B1-C1,因为两点之间直线最短,但当业务复杂时,我们就要通过轮询来查出最优路径
在这里插入图片描述

数据库设计

首先是数据库的设计:创建表:sys_pilot

CREATE TABLE sys_pilot (pilotid numeric(1000) NOT NULL, -- 内场点位Idptname varchar(50) NOT NULL, -- 点位名称xaxis int4 NOT NULL, -- X轴yaxis int4 NULL, -- Y轴transfer varchar(500) NULL, -- 经过点CONSTRAINT sys_pilot_pk PRIMARY KEY (pilotid)
);
COMMENT ON TABLE public.sys_pilot IS '点位图表';

后端代码

根据传入的两点名称,例:A1,C1
最优解:A1-B1-C1就会被依次返回

        private static Dictionary<string, Sys_Pilot> _points;/// <summary>/// 查找图形点位/// </summary>/// <param name="json"></param>/// <returns></returns>/// <exception cref="InterfaceException"></exception>public List<Sys_Pilot> VerifyPilot(string json){Sys_Pilot pilot = JsonHelper.Instance.Deserialize<Sys_Pilot>(json);string[] values = pilot.PtName.Split(',');if (values.Length != 2){throw new InterfaceException("请传入两个点");}string inPoint = values[0];string terminus = values[1];List<Sys_Pilot> pilots = _paramsDal.FindData(new Sys_Pilot());List<Sys_Pilot> shortestPath = ShortestPath(pilots, inPoint, terminus);return shortestPath;}/// <summary>/// 轮询查出中间点/// </summary>/// <param name="pilots"></param>/// <param name="start"></param>/// <param name="end"></param>/// <returns></returns>public List<Sys_Pilot> ShortestPath(List<Sys_Pilot> pilots, string start, string end){_points = pilots.ToDictionary(p => p.PtName);Dictionary<string, int> distances = new Dictionary<string, int>();Dictionary<string, string> previous = new Dictionary<string, string>();HashSet<string> visited = new HashSet<string>();foreach (var point in _points.Values){distances[point.PtName] = int.MaxValue;previous[point.PtName] = null;}distances[start] = 0;while (visited.Count < _points.Count){string current = null;int shortestDistance = int.MaxValue;foreach (var point in _points.Values){if (!visited.Contains(point.PtName) && distances[point.PtName] < shortestDistance){current = point.PtName;shortestDistance = distances[point.PtName];}}visited.Add(current);if (current == end)break;if (_points[current].Transfer != null) {foreach (var neighbor in _points[current].Transfer.Split(',')){if (!_points.ContainsKey(neighbor))continue;int alt = distances[current] + Distance(_points[current], _points[neighbor]);if (alt < distances[neighbor]){distances[neighbor] = alt;previous[neighbor] = current;}}}else if (current == end) {break;}}List<Sys_Pilot> path = new List<Sys_Pilot>();string temp = end;while (temp != null){path.Add(_points[temp]);temp = previous[temp];}path.Reverse();return path;}/// <summary>/// 计算X,Y轴距离距离/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>private int Distance(Sys_Pilot a, Sys_Pilot b){return (int)Math.Sqrt(Math.Pow((a.XAxis - b.XAxis), 2) + Math.Pow((a.YAxis - b.YAxis), 2));}

后记

前端代码是通过Uni-app实现的,有兴趣可以看下Uni-app开发Canvas当子组件示例,点点绘制图形

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

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

相关文章

linux环境基础开发工具1(vim 、 yum)

目录 前言 Linux编辑器-vim使用 Linux 软件包管理器 yum 前言 集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码…

ARM 寄存器学习:(一)arm多种模式下得寄存器

ARM 处理器共有 7 种不同的处理器模式&#xff0c;在每一种处理器模式中可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个(User和Sys不是异常模式&#xff0c;没有spsr寄存器)状态寄存器&#xff08;cpsr和spsr&#xff09;、程序计数器( PC )。 从上图可以看到&#xf…

组合逻辑电路(四)

目录 采用MSI的组合逻辑电路的分析与设计 采用MSI的组合逻辑电路的设计 用具有n个地址输入端的中规模集成器件实现n变量逻辑函数 用译码器设计组合逻辑电路 例 用数据选择器设计组合逻辑电路 例 用具有n个地址输入端的数据选择器实现m变量逻辑函数&#xff08;m>n&#…

在webapp中手动发布一个应用

部署应用前&#xff0c;我们要下载Tomcat Tomcat下载 Tomcat官网&#xff1a;Tomcar官网 下载完成后&#xff0c;我们要找到webapp文件 并创建一个文件夹 创建好后&#xff0c;再创建一个后缀为html文件 接下来 我们要打开连接 打开连接后 我们输入我们的web网址 用完后记得…

Qt篇——QChartView获取鼠标停留位置的数值

需求&#xff1a;鼠标停留在QChartView上时&#xff0c;想要计算停留位置的数值。 一开始的方法是想要通过鼠标移动事件计算鼠标在QChartView上的坐标&#xff0c;在换算成数值&#xff0c;后来发现QChartView中除了图表数据&#xff0c;还有坐标轴与坐标轴数值标签占了高度&a…

openwrt中时间同步ntp使用

前言 openwrt开发中&#xff0c;我们可能遇到这样需求&#xff0c;使用路由器支持局域网内设备ntp授时功能。 作者&#xff1a;羽林君 转载授权以及围观&#xff1a;欢迎关注微信公众号&#xff1a;羽林君 或者添加作者个人微信&#xff1a;become_me ntp是什么 NTP&#…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

Frustum PointNets for 3D Object Detection from RGB-D Data(2018)

3D空间的几何和拓扑结构 直接在3D空间操作可以更自然的参数化以及捕捉 重复、平面、对称等几何结构 2. Related Work 3D Object Detection from RGB-D Data Front view image based methods&#xff08;只是介绍了一种表示方法&#xff09; Bird’s eye view based methods&a…

基于centos7的k8s最新版v1.29.2安装教程

k8s概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语&…

gcc编译初探

记录gcc便编译遇到的问题和积累的经验 文章目录 一、 编译命令编译过程 第二章 遇到问题一、编译的动态库无法正常运行1&#xff09;设置环境变量 LD_LIBRARY_PATH2&#xff09;使用rpath将共享库位置嵌入到程序3&#xff09;将so共享库添加到系统路径 第三章 实用命令一、ldd查…

RN滚动选择组件react-native-wheel-picker-android

安装组件 yarn add react-native-wheel-picker-android我这里的版本为"react-native-wheel-picker-android": "^2.0.6", 示例代码 import { useState } from react import { View } from react-native import { WheelPicker } from react-native-wheel-…

字节飞书前端实习面试

属于是被字节狠狠地拷打了。面试官人很好&#xff0c;让人感觉有很沉稳的感觉。问了一大堆关于底层的问题&#xff0c;属于是把我整麻了。 项目部分问的不多&#xff0c;主要问的都是一些前端涉及的底层知识&#xff0c;层层递进。 1.vue3的响应式是如何实现的 2.computed和wat…