校园导航系统C++

news2024/10/5 17:25:19

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

项目要求:

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.coloradmin.cn/o/1718763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

热敏电阻的设计

热敏电阻(NTC)的作用&#xff1a;抑制开机时的浪涌电流。防止开机瞬间产生的浪涌电流损坏后面的元件。 取值依据:根据对开机的脉冲电流&#xff08;浪涌电流&#xff09;小于多少A&#xff1f; 由,这个U是指最大输入电压&#xff0c;I为要求的浪涌电流。 NTC是负温度系数的热…

设计模式23——状态模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 状态模式&#xff08;State&am…

打造高效上传体验:基于Kotlin的Android快速上传框架

1. 引言 在Android开发中&#xff0c;文件上传操作常常面临各种挑战&#xff0c;为此我开源了一个高效、易用的快速上传框架&#xff0c;助力开发者轻松实现文件上传功能。 GitHub项目地址: 点我 2. 框架特点概述 纯Kotlin编写&#xff1a;简洁、现代的编程语言。MVVM架构&a…

动态分配函数参数用二级指针的作用

文章目录 前言一、案例 前言 在一些情况下&#xff0c;我们需要在函数内部动态地分配内存来存储结构体&#xff0c;并且需要在函数外部访问该结构体。在这种情况下&#xff0c;可以使用二级指针作为函数参数来实现动态内存分配&#xff0c;并且在函数外部使用指针访问结构体。…

py黑帽子学习笔记_web攻击

python网络库 py2的urllib2 py3好像把urllib2继承到了标准库urllib&#xff0c;直接用urllib就行&#xff0c;urllib2在urllib里都有对应的接口 py3的urllib get请求 post请求&#xff0c;和get不同的是&#xff0c;先把post请求数据和请求封装到request对象&#xff0c;再…

数字化转型对企业来说意味着什么?

数字化转型是当今社会不可避免的趋势&#xff0c;它的发展其实是多方面因素影响导致的。首先&#xff0c;随着科技的迅速发展&#xff0c;人们对于信息获取和处理的需求越来越强烈&#xff0c;这促使了各行各业都要朝着数字化方向发展。其次&#xff0c;全球化的潮流让企业需要…

制作U启动装win10系统

一、背景 在我们日常上班过程中经常会遇到以下问题&#xff1a; 1、c盘快满了 2、新电脑用着好卡 3、买新电脑不会装系统 二、实现方式 通常我们遇到这种情况 都会选择去电脑专卖店找专人装系统 但是这样又需要花费自己的money&#xff0c;这样显得自己不够专业像个菜鸟&#…

【成品设计】基于STM32单片机的语音远程运算器

《基于STM32单片机的语音远程运算器》 输入端 所需器件&#xff1a; STM32最小系统板。语音识别模块&#xff1a;用于检测语音命令。蓝牙模块&#xff1a;作为主机用于与输出端蓝牙模块进行连接&#xff0c;发送数据。蜂鸣器红色LED&#xff1a;用于语音命令检测错误提示。 …

记录一次云服务器无法连接的排查过程

运行环境&#xff1a;阿里云服务器 故障外显原因&#xff1a;登录失败,操作系统禁用了密码登录方式 控制台监控数据显示云盘读写BPS拉满了 因为之前问过线上售后&#xff0c;让安装了atop监控&#xff0c;&#xff0c;所以先打开atop日志&#xff1a; atop -r /var/log/atop…

揭秘数字货币:比特币背后的技术逻辑

随着科技的飞速发展,数字货币作为一种新兴的经济形态,已经逐渐走入我们的视野。其中,比特币无疑是这一领域的佼佼者。那么,比特币背后的技术逻辑究竟是什么呢?本文将为您揭开这一神秘面纱。 一、区块链技术:比特币的基石 比特币的核心技术就是区块链(Blockchain)。区块…

[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录 0.子序列 vs 子数组1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.摆动序列1.题目链接2.题目链接3.代码实现 0.子序列 vs 子数组 子序列&#xff1a; 相对顺序是跟源字符串/数组是一致的但是元素和元素之间&#xff0c;在源字符串/数组中可以是不连续的一般时间…

前端开发:$nextTick()的使用及原理

目录 前言 $nextTick()的概念 $nextTick()的用法和原理 1、$nextTick()用法 2、$nextTick()原理 $nextTick()的具体使用示例 拓展&#xff1a;面试中考察$nextTick()的底层原理 最后 前言 在前端开发中&#xff0c;涉及到JS原生的使用原理是非常重要的知识点&#xff0…

Spring Boot详解:深入了解与实践

文章目录 1. Spring Boot简介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…

Microsoft Dynamics 365 Business Central 讲解VAT RATE CHANGE TOOL(增值税税率更改工具)

学习目标&#xff1a; 如果使用VAT RATE CHANGE TOOL&#xff08;增值税税率更改工具&#xff09; 过程演示&#xff1a; 1.创建新的VAT产品过账组 2.创建新的总账科目以过账采购、销售和逆向征收增值税。 3.给新的VAT产品过账设置过账设置 4.创建一个新的一般产品过账组 5…

百度地图1

地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时&#xff0c;zoom必须赋值&#xff0c;范围3-19级&#xff0c; // 百度地图API功能var map new BMap.Map("map"); //…

element-plus关于表单数据自定义参数校验

element-plus关于表单数据自定义参数校验 核心点&#xff1a; 代码&#xff1a; <el-form-item :prop"tableData[ scope.$index ].score":rules"[{ required: true, message: 得分不能为空, trigger: blur },{ validator: (rule: any, value: any, ca…

2024最新群智能优化算法:大甘蔗鼠算法(Greater Cane Rat Algorithm,GCRA)求解23个函数,提供MATLAB代码

一、大甘蔗鼠算法 大甘蔗鼠算法&#xff08;Greater Cane Rat Algorithm&#xff0c;GCRA&#xff09;由Jeffrey O. Agushaka等人于2024年提出&#xff0c;该算法模拟大甘蔗鼠的智能觅食行为。 参考文献 [1]Agushaka J O, Ezugwu A E, Saha A K, et al. Greater Cane Rat Alg…

Whisper-AT:抗噪语音识别模型(Whisper)实现通用音频事件标记(Audio Tagger)

本文介绍一个统一音频标记&#xff08;Audio Tagger&#xff09;和语音识别&#xff08;ASR&#xff09;的模型&#xff1a;Whisper-AT&#xff0c;通过冻结Whisper的主干&#xff0c;并在其之上训练一个轻量级的音频标记模型。Whisper-AT在额外计算成本不到1%的情况下&#xf…

MySQL 命令总结篇-思维导图

一些常用命令以思维导图形式总结在这里了&#xff0c;掌握这些进行MySQL基本操作绝对没问题&#xff0c;加油&#xff01;友友们可以根据这些思维导图进行知识总结。 目录 一、快速上手 二、SQL 语句分类&#xff08;DDL、DML、DQL、DCL&#xff09; 三、数据类型 四、约束…

图书管理系统——Java实现

文章目录 Java实现图书管理系统问题分析框架搭建业务实现项目测试代码演示BookioperationUserMain&#xff08;默认包&#xff09; Java实现图书管理系统 学习了前六篇的SE语法&#xff0c;我们现在要用它们实现一个简单的图书管理系统项目&#xff0c;深入了解各个知识点的应…