校园导航系统C++

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

项目要求:

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音电商经验分享,揭秘做好抖店的七个关键细节,不容忽视

大家好&#xff0c;我是电商花花。 随着抖音电商和大量商家的不断入驻&#xff0c;大家对于电商的玩法也逐渐变多&#xff0c;拿到结果的商家也是越来越多&#xff0c;更多的做店玩法和步骤被更多人熟知。 现在想要做好抖店&#xff0c;其实也没有想象中那么复杂和困难。 新…

网络安全基础技术扫盲篇名词解释之“证书“

用通俗易懂的话说&#xff1a; 证书就好比是一张身份证&#xff08;类似&#xff0c;但不完全相同&#xff09;&#xff0c;用来证明一个网站的身份是否可信。就像你要确认一个陌生人的身份需要看他的身份证一样&#xff0c;电脑在连接一个网站时&#xff0c;也会查看网站的证…

停车场车位引导系统方案升级实施步骤流程是什么,有什么注意事项

停车场车位引导系统是一种现代化的停车管理系统&#xff0c;它通过实时监测车位占用情况&#xff0c;并向驾驶员提供准确的空闲车位导航信息&#xff0c;从而提高停车场的使用效率和用户体验。随着城市交通的快速发展和车辆数量的不断增加&#xff0c;停车场车位引导系统已成为…

树形结构-CRUD接口

先看一下效果&#xff1a;整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加载预训练模型参数对不齐和收到意外参数报错解决方案

使用mmdetection时遇到的问题比较多&#xff0c;首先要对自己要使用的预训练模型有一定的了解&#xff0c;并且懂得使用各种分类模型时不同的模型不同任务执行阶段需要参数上的对其。&#xff08;比如mask-rcnn和它的三个头之间的参数&#xff09;。 首先&#xff0c;谈谈torc…

一个案例告诉你,MySQL如何查询今天、昨天、近7天、近30天、本月、上个月、本季度、上季度、本年、上一年数据

参考博客 mysql查询当天/昨天/近7天/近30天/本月/上个月/本季度/上季度/本年/上一年 数据 正文内容 创建测试案例&#xff08;也可直接使用附录MySQL脚本生成数据&#xff09; 1、新建测试表 CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY,date_column DATE,d…

深入Kafka消息分区机制:从原理到实践

深入Kafka消息分区机制&#xff1a;从原理到实践 在现代分布式系统中&#xff0c;如何高效地处理海量数据是一个至关重要的问题。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、实时分析等场景。为了保证数据的高效处理和系统的高可扩展性&am…

ChatGPT的逆袭历程:核心技术深度解析

在ChatGPT问世之前&#xff0c;已有许多大模型存在&#xff0c;但为何只有它成为了AI时代的“iPhone时刻”&#xff1f;这不仅得益于其技术优势&#xff0c;还在于其发展过程中所采用的一系列创新策略。本文将深度复盘ChatGPT的逆袭历程&#xff0c;分析其核心技术&#xff0c;…

数组中的第K个最大元素,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 题目地址&#xff1a; 215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&a…

蚂蚁技术日首次开放,精彩看点分享

每年的 5 月 27 日&#xff0c;是蚂蚁的技术日&#xff0c;用来鼓励蚂蚁技术人保持敬畏和创新之心&#xff0c;到今天&#xff0c;第九届“527 蚂蚁技术日”已发展成为技术周&#xff0c;成为蚂蚁技术人的嘉年华。 2015 年 5 月 27 日&#xff0c;因为光纤被挖断&#xff0c;全…

visual studio code 全局搜索

VScode写代码的时候&#xff0c;会经常性的需要进行查找代码&#xff0c;那么怎么在Visual Studio Code中进行查找呢&#xff0c;下面就来大家vscode全局搜索的方法。 想要在vscode全局搜索进行全局搜索&#xff0c;使用快捷键CTRLSHIFTF即可进行搜索&#xff0c;也可以在左边…

排序算法(一) 基础排序算法

排序算法 基础排序算法 排序本质&#xff1a;减小逆序对的过程 在基础排序算法中&#xff0c;将待排序序列分为相对有序区与相对无序区。 每次遍历到数组末尾称为一轮。 冒泡排序(无序区-有序区, O ( n 2 ) O(n^2) O(n2),稳定,就地) 在每一轮中&#xff0c;逐次与下一邻项…

MMrotate报错AttributeError: ‘NoneType‘ object has no attribute ‘shape‘

使用MMrotate训练自定义数据集报错&#xff1a; AttributeError: ‘NoneType’ object has no attribute ‘shape’ 2024-05-31 17:48:06,121 - mmrotate - INFO - workflow: [(train, 1)], max: 12 epochs 2024-05-31 17:48:06,121 - mmrotate - INFO - Checkpoints will be …

太速科技-基于3U VPX 4核8线程I7 X86主板

基于3U VPX 4核8线程I7 X86主板 一、产品概述 该产品是一款基于第六代Intel i7四核八线程处理器的高性能3U VPX刀片式计算机。产品提供了4个x4 PCIe 3.0总线接口&#xff0c;其中2个x4 PCIe 3.0接口可配置为1个x8 PCIe3.0接口&#xff0c;另外2个x4 PCIe 3.0接口可灵活配置…

8086 汇编笔记(三):第一个程序

一、一个源程序从写出到执行的过程 第一步&#xff1a;编写汇编源程序 第二步&#xff1a;对源程序进行编译连接 第三步&#xff1a;执行可执行文件中的程序 二、源程序 codesg segment ; 定义一个段&#xff0c;段的名称为“codesg”&#xff0c;这个段从此开始…

向量数据库引领 AI 创新——Zilliz 亮相 2024 亚马逊云科技中国峰会

2024年5月29日&#xff0c;亚马逊云科技中国峰会在上海召开&#xff0c;此次峰会聚集了来自全球各地的科技领袖、行业专家和创新企业&#xff0c;探讨云计算、大数据、人工智能等前沿技术的发展趋势和应用场景。作为领先的向量数据库技术公司&#xff0c;Zilliz 在本次峰会上展…

[代码复现]Self-Attentive Sequential Recommendation

参考代码&#xff1a;SASRec.pytorch 可参考资料&#xff1a;SASRec代码解析 前言&#xff1a;文中有疑问的地方用?表示了。可以通过ctrlF搜索’?。 环境 conda create -n SASRec python3.9 pip install torch torchvision因为我是mac运行的&#xff0c;所以device是mps 下面…

【计算机网络】——概述(图文并茂)

概述 一.信息时代的计算机网络二.互联网概述1.网络&#xff0c;互连网&#xff0c;互联网&#xff08;因特网&#xff09;1.网络2.互连网3.互联网&#xff08;因特网&#xff09; 2.互联网简介1.互联网发展的三个阶段2.互联网服务提供者&#xff08;ISP&#xff09;3.互联网的组…

计算器状态的初始化之旅

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、状态属性的创建与初始化 三、内部函数与显示逻辑 四、总结与展望 一、引言 在…

使用element的提示框并修改css

使用el-tooltip来做提示框&#xff1a; <el-tooltip popper-class"popper" content"敬请期待" placement"right"><div><i class"iconfont icon-lianjie-01"></i><span>输入链接</span></div&…