校园导航系统C++

devtools/2024/10/22 15:35:04/

制作一个简单的大学城导航系统,根据用户指定的起点和终点,求出最短路径长度以及具体路径。

项目要求:

1)程序与数据相分离,地图中的所有数据都是从文件读入,而不是写在代码中

2)最短路径算法不能调用函数库

3)菜单界面可以循环显示,每次显示前先清屏

4)输入的起点和终点若不存在,能给出相应提示并允许重新输入(有可能多次输入都不存在) 5)能够显示两个地点的简介

6)能够根据起点和终点计算出正确的最短路径长度

7)能够显示出具体的最短路径(比如:中大 -> 广外->广中医)

8)如果起点与终点之间不可达,要有相应提示。 本地图中,只有鲤鱼岗不可达,如果代码中根据起点或终点直接判断是否鲤鱼岗来得出不可达的结论,则代码不达标,必须是由最短路径算法运算后来判断是否可达。   

#include <iostream>
#include <fstream>
#include <cstdlib> 
using namespace std;const int MAX = 100;                 
int map[MAX][MAX];                 // 地点间的邻接矩阵
string name[MAX];                  //地点名称表
string intro[MAX];                 // 地点简介
int n, m;                          // 地点个数和边的个数//打开数据文件 函数 
bool read(const char* filename) {ifstream file(filename);if (!file) {return false;}file >> n >> m;                     //读入地点个数和边的个数for (int i = 1; i <= n; ++i) {      //初始化邻接矩阵for (int j = 1; j <= n; ++j) {map[i][j] = -1;}}int u, v, w;for (int i = 0; i < m; ++i) {      //建立邻接矩阵file >> u >> v >> w;map[u][v] = w;map[v][u] = w;}file.ignore();                   for (int i = 1; i <= n; ++i) { getline(file, name[i]);        //建立地点名称表}for (int i = 1; i <= n; ++i) {getline(file, intro[i]);       //读入地点简介}                                  file.close();return true;
}// 打印地点列表 函数                               
void display() {for (int i = 1; i <= n; ++i) {cout <<"      "<< i << "-" << name[i] ;if(i%4==0) cout<<endl<<endl; }                               
}//Dijkstra算法求最短路径 函数 
void dj(int start, int end, int& minDist, int path[]) {//path存储起点到各个节点的最短距离 bool visited[MAX];               //visited记录结点是否被访问过 int dist[MAX];                   //dist存储起点到各个节点的最短距离for (int i = 1; i <= n; ++i) {       visited[i] = false;          //1初始化dist[i] = INT_MAX;          }dist[start] = 0;                for (int i = 1; i <= n; ++i) {int u = -1;int minDist = INT_MAX;for (int j = 1; j <= n; ++j) {   //2在dist中选出未被访问的最小值,赋值给 u if (!visited[j] && dist[j] < minDist) {u = j;                 minDist = dist[j];}}if (u == -1) {break;}visited[u] = true;          for (int v = 1; v <= n; ++v) {  //3比较 ,更新dist if (!visited[v] && map[u][v] != -1 && dist[u] + map[u][v] < dist[v]) {dist[v] = dist[u] + map[u][v];              path[v] = u;}}}minDist = dist[end];
}// 输出具体路径的函数 
void Minpath(int start, int end, int path[]) {if (start == end) {cout << name[start];return;}Minpath(start, path[end], path); cout << " -> " << name[end];
}int main() {const char* filename = "map.txt";if (!read(filename)) {cout << "无法读取地图数据文件。" << endl;return 1;}int start, end;while (true) {system("cls");  //清屏 cout << "-------------------------广州大学城简易导航系统-----------------------" << endl;cout<<endl;display();cout<<"      0-退出"<<endl; cout << "----------------------------------------------------------------------"<<endl;cout << "请输入起点编号:";cin >> start;if (start == 0) {cout << "欢迎再次使用!" << endl;break;} while(start < 1 || start > n) {cout << "编号不存在,请重新输入"<<endl;cout << "请输入起点编号:";cin >> start;}cout << "请输入终点编号:";cin >> end;if (end == 0) {cout << "欢迎再次使用!" << endl;break;} while(end < 1 || end > n) {cout << "编号不存在,请重新输入"<<endl;cout << "请输入终点编号:";cin >> end;}cout << endl;cout << intro[start] << endl;          //输出简介 cout << endl;cout << intro[end] << endl;cout << endl;int minDist, path[MAX];dj(start, end, minDist, path);         //计算最短路径  if (minDist == INT_MAX) {cout << name[start] << " 到 " << name[end] << "的最短路径是:无法到达。" << endl;} else {cout << name[start] << " 到 " << name[end] << "的最短距离是:" << minDist <<"m"<<endl;cout<<endl;cout << "具体路径是:";Minpath(start, end, path);         //输出路径 cout << endl;}cout << "按任意键继续...";cin.ignore();cin.get();}return 0;
}


http://www.ppmy.cn/devtools/45145.html

相关文章

十四天学会Vue——Vue 组件化编程(理论+实战)(第四天)

二、 Vue组件化编程 2.1 组件化模式与传统方式编写应用做对比&#xff1a; 传统方式编写应用 依赖关系混乱&#xff0c;不好维护&#xff1a;例如&#xff1a;比如需要引入js1&#xff0c;js2&#xff0c;js3&#xff0c;但是js3需要用到js1、2的方法&#xff0c;所以js1、2…

【星海出品】Langchain Prompt template

Management prompt words We can use this program to face students from different families. But now this program cannot communicate in Chinese. URL: https://platform.openai.com/account/api-keys LLMs&#xff1a; 这是一个语言模型&#xff0c;It lets input word…

JavaSE:异常

1、什么是异常 在生活当中&#xff0c;不管是人还是动物又或是植物&#xff0c;都会生病&#xff1b;在程序中也是&#xff0c;作为程序猿&#xff0c;虽然我们会尽力将程序写的完美&#xff0c;可难免会出现一些问题~ 在程序执行过程中&#xff0c;发生的一些不正常行为&…

ChatGPT-4o在临床医学日常工作、论文高效撰写与项目申报、数据分析与可视化、机器学习建模中的应用

ChatGPT-4o在临床医学日常工作、论文高效撰写与项目申报、数据分析与可视化、机器学习建模中的应用 2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。…

【Linux 网络】网络基础(三)(其他重要协议或技术:DNS、ICMP、NAT)

一、DNS&#xff08;Domain Name System&#xff09; DNS 是一整套从域名映射到 IP 的系统。 1、DNS 背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西&#xff0c;是一个字符串&…

SQL 语言:对象关系数据模型

文章目录 嵌套关系复杂类型继承引用类型与复杂类型有关的查询函数和过程总结 对象关系数据模型扩展关系数据模型的方式是通过提供一个包括复杂数据类型和面向对象的更丰富的类型系统。 嵌套关系 嵌套关系模型(Nested Relational Model)是关系模型的一个扩展&#xff0c;域可以…

pcl::PointCloud各种添加点云方法的速度对比

pcl::PointCloud官方提供了一个添加点云的函数接口push_back()&#xff0c;但是实际中经常看到有人先调用resize()函数&#xff0c;再逐个进行赋值&#xff0c;理由是这样更快。本文对两种方法的速度进行对比。 首先详细介绍一下输入数据和这两种方法&#xff1a; 1. 输入数据…

iOS AVFoundation 音视频源码分享

引言 在现代移动开发中&#xff0c;音视频处理是一个不可忽视的重要领域。iOS 提供了强大的 AVFoundation 框架&#xff0c;使开发者能够轻松实现音视频录制、播放、编辑等功能。无论是创建高效的视频播放器&#xff0c;还是实现复杂的音频处理&#xff0c;AVFoundation 都能提…