算法实训课程-贵师大地图智能导航-基于最短路径算法

2023-12-18 03:10

本文主要是介绍算法实训课程-贵师大地图智能导航-基于最短路径算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. PDF:
    1. 演示:
    2. 下载:链接:https://pan.baidu.com/s/1rQWonClneqv-Wh7IZyJ0Vg
      提取码:6nud
  2. C++算法:
    1. #include <iostream>
      #include <fstream>
      #include <cstring>
      #include <algorithm>
      #include <stack>using namespace std;
      #define inf 999999
      #define nmax 110
      int n, m, edge[nmax][nmax], path[nmax][nmax], value[nmax][nmax];struct vertex
      {// 点编号1~nint id;// 该点名字, 例如(贵师大等等)string name;
      } V[nmax];ofstream fout;
      ifstream fin;
      // 初始化边
      void init();// 全局变量初始化
      void dataInit();// 手动输出边
      void input();
      // 保存边
      void save();
      // 计算最短路径
      void minPath();
      // 打印最短路径值
      void print_min_value();
      // 打印路径
      void print_path(int i, int j);
      //
      void get();//增加一个点
      void addVertex();// 查看所有位置信息
      void showAllVerter();int main()
      {dataInit();init();// input();// get();// addVertex();// minPath();showAllVerter();get();// save();return 0;
      }void init()
      {fin.open("./edge", ios::in);fin >> n;for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)fin >> edge[i][j];fin.close();// 加载位置信息fin.open("./vecter", ios::in);for (int i = 1; i <= n; ++i){fin >> V[i].id >> V[i].name;}fin.close();// 加载计算后的数据fin.open("./value", ios::in);for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)fin >> value[i][j];fin.close();// 加载路径fin.open("./path", ios::in);for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)fin >> path[i][j];fin.close();
      }void get()
      {int i, j;cout << "please enter the start and end (0 0 end the enter!):" << endl;while (cin >> i >> j && i && j){cout << i << " -> " << j << " : ";cout << value[i][j] << endl;cout << "path"<< " : ";print_path(i, j);}
      }void save()
      {// 保存位置信息fout.open("./vecter", ios::out);for (int i = 1; i <= n; ++i){fout << V[i].id << " " << V[i].name << endl;}fout.close();fout.open("./edge", ios::out);// 点的总数fout << n << endl;// 保存边for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j)fout << edge[i][j] << " ";fout << endl;}fout.close();fout.open("./value", ios::out);// 保存以计算后的数据for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j)fout << value[i][j] << " ";fout << endl;}fout.close();// 保存路径fout.open("./path", ios::out);for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j)fout << path[i][j] << " ";fout << endl;}fout.close();
      }void input()
      {memset(edge, inf, sizeof(edge));memset(value, inf, sizeof(value));memset(path, -1, sizeof(path));string name;int i, j;cout << "输入该位置名称(end结束输入!)" << endl;while (cin >> name && name != "end"){cout << "该位置的编号为: " << ++n << endl;V[n].id = n;V[n].name = name;cout << "请输入该位置与其他位置之间的距离,格式:s e 100(0 0结束)" << endl;while (cin >> i >> j && (i && j)){cin >> edge[i][j];edge[j][i] = edge[i][j];}}minPath();save();
      }void minPath()
      {// 重新计算valuefor (int i = 1; i <= n; ++i){value[i][i] = edge[i][i] = 0;for (int j = 1; j <= n; ++j)value[i][j] = edge[i][j];}memset(path, -1, sizeof(path));for (int k = 1; k <= n; k++){for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (value[k][j] < inf && value[i][k] < inf && value[i][j] > value[i][k] + value[k][j]){value[i][j] = value[i][k] + value[k][j];path[i][j] = k;}}}}
      }// 打印路径
      void print_path(int i, int j)
      {int flag = 0;if (i > j){flag = 1;swap(i, j);}stack<int> Q;while (true){if (i == j){cout << V[i].name << " --> " << V[i].name << endl;break;}// i->j 中间无位置,且可直达else if (path[i][j] == -1 && edge[i][i] != inf){Q.push(j);Q.push(i);break;}// i->j 不可到达else if (path[i][j] == -1 && edge[i][i] == inf){cout << V[i].name << " --> " << V[j].name << " 不可到达" << endl;}// i->j之间还有位置else if (path[i][j] != -1){Q.push(j);j = path[i][j];}}// stack去倒置if (flag){stack<int> temp;while (!Q.empty()){temp.push(Q.top());Q.pop();}Q.swap(temp);}// 打印位置路径while (!Q.empty()){int index = Q.top();Q.pop();cout << V[index].name;if (!Q.empty())cout << " -->> ";else{cout << endl;}}
      }
      //增加一个点
      void addVertex()
      {// todo 有bugcout << "请输入该位置的名称(end结束):";string name;cin >> name;n++;V[n].id = n;V[n].name = name;for (int i = 1; i <= n; ++i){edge[i][n] = edge[n][i] = inf;}edge[n][n] = 0;cout << "该位置的编号为: " << n << endl;cout << "请输入该位置与其他位置之间的距离,格式:s e 100(0 0结束)" << endl;int i, j;while (cin >> i >> j && i && j){cin >> edge[i][j];edge[j][i] = edge[i][j];}cout << "请输入该位置的名称(end结束):";minPath();save();
      }void showAllVerter()
      {for (int i = 1; i <= n; ++i){cout << V[i].id << " " << V[i].name << endl;}
      }void dataInit()
      {n = 0;m = 0;memset(edge, inf, sizeof(edge));memset(path, -1, sizeof(path));memset(value, inf, sizeof(value));
      }

       

  3. 测试数据:
    1. 西北门
      0 0
      西门
      2 1 197
      0 0
      一食堂
      3 1 255
      3 2 155
      0 0
      二食堂
      4 3 320
      0 0
      行政楼
      5 4 305
      0 0
      新校区法学院
      6 5 229
      0 0
      17栋宿舍
      7 6 150
      0 0
      研究生学院
      8 3 247
      0 0
      文学院
      9 8 236
      0 0
      图书馆
      10 9 187
      0 0
      end
      机械与电机工程学院
      11 10 245
      0 0
      三食堂
      12 11 207
      12 6 111
      12 7 215
      0 0
      理科综合实验楼
      13 11 75
      13 10 260
      0 0
      物理与电子科学学院
      14 13 320
      14 10 185
      0 0
      外语学院
      15 14 310
      15 8 257
      15 9 236
      0 0

       

  4. QT项目:
    1. 演示:
    2. 源码链接:

      https://github.com/yangqizhou/literate-barnacle.git

这篇关于算法实训课程-贵师大地图智能导航-基于最短路径算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2