旅游景点咨询系统的设计与实现

【实验目的】

  1. 熟悉图数据结构的基本特征、构造方法
  2. 理解迪杰斯特拉算法、弗洛伊德算法寻找最小路径的原理
  3. 练习上述数据结构与算法的实现。

【实验原理】

  1. 图的创建与遍历算法
  2. 迪杰斯特拉算法从给定的一点出发,求该点到所有其他顶点的最短路径,我们将顶点集合G分成已经求出最短路径的点的集合She 尚未求出最短路径的点的集合(T=V-S)两部分,我们将T中的点按照距离递增的次序加到S中,并将最短距离记录到D中。

【实验内容】

  1. 问题描述:
    创建一个至少有15个点的有向网表示的某个旅游景点的导游图。顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。建立一个游客咨询系统。

  2. 基本要求 :
    (1)创建图的存储结构;
    (2)输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道);
    (3)输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息”。

  3. 重点、难点
    重点:
    (1)通过实验掌握图状结构数据的存储与表式;
    (2)通过实验掌握对图的存储、遍历、运算等各种操作;
    (3)深入理解图的特征及应用;
    难点:
    (1)任意两个景点所有路径的计算;
    (2)最短路径的计算与算法设计。

【程序代码与运行结果】

BasicDefine.h

#pragma once
#include<stdlib.h>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#define MAX 32767
#define INFINITY 32767
#define SPOTS_MAXNUM 30
using namespace std;typedef struct NUM
{int length;//路径长度int way;//表示通行方法
}Path;
typedef struct//旅游景点信息数据类型
{char name[30];//景点名int num;//景点编号
}Spot;typedef struct
{Spot spots[SPOTS_MAXNUM];			//旅游景点信息NUM pathMat[SPOTS_MAXNUM][SPOTS_MAXNUM];	//路径int vexnum, edgenum;							//景点数目、路径数目 
}Map;Map *CreateMap(Map *G);		//创建地图
void Dijkstra(Map *G, int v0);	//迪杰斯特拉算法寻找最短路径
int MatchNum(Map *G, char a[]);	//根据景点名匹配其编号
void FindPath(Map *G, int i, int j, int k, int &a);	//递归调用,寻找所有路线 
void disppath(Map *G, int start, int end, int &a);	//初始化相关数组,调用path函数
void ShowPath(int start, int end);	//显示路径
void SearchAllpath(Map *G);	//寻找所有路径
void SpotsList(Map *G);		//显示所有景点
void Menu();	//用户界面
void Exit();	//退出界面

interface.cpp

#include"BasicDefine.h"void SpotsList(Map *G)
{int i;cout << "〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n";cout << "        编号               景点名称       \n";for (i = 1; i <= G->vexnum; i++) {cout << "        " << G->spots[i].num << "                 " << G->spots[i].name << endl;}cout << "〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n";
}void Menu()
{cout << endl;cout << "****\t1.查询任意两个景点间的最短路径\t****" << endl;cout << "****\t2.查询任意两个景点间的所有路径\t****" << endl;cout << "****\t3.退出系统              \t****" << endl;cout << "请选择:";
}void Exit()
{cout << "           〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓" << endl;cout << "           □                                      □" << endl;cout << "           □             感谢您的使用!           □" << endl;cout << "           □                                      □" << endl;cout << "           〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓" << endl;
}

main.cpp

	#include"BasicDefine.h"Map *G;Map *CreateMap(Map *G) //创建地图
{int i, j, k, w, p;int max = 0;cout << "请输入旅游景点数目:";cin >> G->vexnum;for (i = 1; i < G->vexnum; i++) {max += i;}cout << "请输入路径数目";cout << "(注:路径数取值范围[" << G->vexnum - 1 << ", " << max << "]):" ;cin >> G->edgenum;cout << endl << "请依次输入景点的编号和名称,用空格隔开,如:1 安徽大学" << endl;for (i = 1; i <= G->vexnum; i++){cin >> G->spots[i].num >> G->spots[i].name;}cout << endl << "景点代号及名称输入完毕!" << endl;system("pause");system("cls");SpotsList(G);for (i = 1; i <= G->vexnum; i++)for (j = 1; j <= G->vexnum; j++)G->pathMat[i][j].length = INFINITY;//初始化邻接矩阵cout << "请依次输入两个景点的编号、它们的距离以及通行方式,用空格隔开" << endl;cout << "注意:距离单位为M,通行方式为0表示步行,1表示做索道" << endl;cout << "输入示例:1 4 9 0" << endl;for (k = 1; k <= G->edgenum; k++){cout << "第" << k << "条边:\t";cin >> i >> j >> w >> p;G->pathMat[i][j].length = w;G->pathMat[i][j].way = p;}return G;
}long int Dist[SPOTS_MAXNUM];
int p[SPOTS_MAXNUM][SPOTS_MAXNUM];void Dijkstra(Map *G, int v0) //迪杰斯特拉算法寻找最短路径
{int v, w, k, min, x, i;int path[SPOTS_MAXNUM];for (v = 1; v <= G->vexnum; v++){path[v] = 0;Dist[v] = G->pathMat[v0][v].length;//用Dist数组存储其路径for (w = 1; w <= G->vexnum; w++)p[v][w] = 0;if (Dist[v] < MAX){p[v][v0] = 1;p[v][v] = 1;}}Dist[v0] = 0;	//vo到vo的路径长度为0path[v0] = 1;	//vo到vo不用求路径for (i = 1; i <= G->vexnum; i++)//开始主循环。每次求得vo到某个顶点v的最短路径{min = INFINITY;for (w = 1; w <= G->vexnum; w++)if (!path[w])if (Dist[w] < min){v = w;min = Dist[w];}path[v] = 1;for (w = 1; w <= G->vexnum; w++)if (!path[w] && (min + G->pathMat[v][w].length < Dist[w])){Dist[w] = min + G->pathMat[v][w].length;for (x = 1; x <= G->vexnum; x++)p[w][x] = p[v][x];p[w][w] = 1;}}
}
int MatchNum(Map *G, char a[])	//根据景点名匹配其编号
{int i;for (i = 1; i <= G->vexnum; i++)if (strcmp(G->spots[i].name, a) == 0)break;if (i == (G->vexnum + 1))return -1;elsereturn G->spots[i].num;
}int visited[SPOTS_MAXNUM];
int v[SPOTS_MAXNUM];
void FindPath(Map *G, int i, int j, int k, int &a) //递归调用,寻找所有路线 
{int s;if (v[k] == j){a++;cout << "第" << a << "条:";string ways;for (s = 1; s < k; s++) {ways = (G->pathMat[v[s]][v[s + 1]].way == 0) ? "步行" : "索道";cout << G->spots[v[s]].name <<   "-("<<G->pathMat[v[s]][v[s + 1]].length <<"m"<< ways << ")->";}cout << G->spots[v[s]].name << endl;}s = 1;while (s <= G->vexnum){if (s != i){if (G->pathMat[v[k]][s].length != MAX && visited[s] == 0){visited[s] = 1;v[k + 1] = s;FindPath(G, i, j, k + 1, a);visited[s] = 0;}}s++;}
}
void disppath(Map *G, int start, int end, int &a)	//初始化visit数组,调用path函数
{ int k;v[1] = start;for (k = 1; k <= G->vexnum; k++)visited[start] = 0;FindPath(G, start, end, 1, a);
}void SearchAllpath(Map *G)
{//输入起点与终点,调用disppath函数寻找路径 int i, j;		//i代表起点,j代表终点 char b[10], c[10];cout << "请输入起点景点名称:";cin >> b;i = MatchNum(G, b);getchar();if (i == -1){cout << "您输入的起点景点不存在!" << endl;return;}cout << "请输入终点景点名称:";cin >> c;j = MatchNum(G, c);getchar();if (j == -1){cout << "您输入的终点景点不存在!" << endl;return;}int a = 0;disppath(G, i, j, a);if (a == 0) {cout << "两景点不可达!" << endl;}else {cout << "共" << a << "条路径!" << endl;}
}void ShowPath(int start, int end)	//显示路径
{int a, b, c, d, q = 0;a = end;if (a == start)cout << "起点与终点相同!" << endl;else if (Dist[a] >= INFINITY)cout << "两景点不可达!" << endl;else{cout << "\n从" << G->spots[start].name << "到" << G->spots[end].name << "的最短路径是";cout << "\t" << G->spots[start].name;d = start;for (c = 1; c <= SPOTS_MAXNUM; c++){here:p[a][start] = 0;string ways;for (b = 1; b <= SPOTS_MAXNUM; b++){if (G->pathMat[d][b].length < MAX&&p[a][b]){ways = (G->pathMat[d][b].way == 0) ? "步行" : "索道";cout << "--(" << G->pathMat[d][b].length << "m" << ways << ")-->" << G->spots[b].name;p[a][b] = 0;d = b;goto here;}}}cout << endl << "距离为" << Dist[a] << "m\n\n\t";}
}int main(void)
{int i;int v0, v1;G = (Map *)malloc(sizeof(Map));	//初始化变量G = CreateMap(G);	//创建地图system("cls");Menu();	//显示交互界面cin >> i;while (1){switch (i){case 1:	//查询任意两个景点间的最短路径system("cls");SpotsList(G);cout << "\n\n请选择起点景点:" ;cin >> v0;cout << "请选择终点景点:" ;cin >> v1;Dijkstra(G, v0);ShowPath(v0, v1);cout << "\n" << endl;system("pause"); system("cls");Menu();break;case 2:	//查询任意两个景点间的所有路径system("cls");SpotsList(G);SearchAllpath(G);system("pause"); system("cls");SpotsList(G);Menu();break;case 3:	//退出system("cls");Exit();return 0;default:cout << "请重新选择:" << endl;break;}cin >> i;}
}

输入的景点信息为:

  1. 文典阁
  2. 博学北楼
  3. 博学南楼
  4. 笃行北楼
  5. 笃行南楼
  6. 行知楼
  7. 适之楼
  8. 艺术楼
  9. 体育馆
  10. 鸣磬广场
  11. 教学主楼
  12. 逸夫楼
  13. 问津楼
  14. 电化楼
  15. 眼镜湖
    在这里插入图片描述
    输入的路径信息为:
    1 2 300 0
    1 3 300 0
    1 4 200 0
    1 5 200 0
    1 6 600 0
    1 7 800 1
    1 8 1200 1
    1 9 1300 1
    1 10 200 0
    2 4 50 0
    2 6 100 0
    3 5 100 0
    3 7 600 0
    4 10 500 0
    5 9 1600 1
    5 10 600 0
    6 8 400 0
    6 9 1100 1
    7 8 600 0
    8 9 1400 1
    10 12 9000 1
    11 12 400 0
    11 13 300 0
    11 14 400 0
    11 15 500 0
    12 13 700 0
    12 14 600 1
    13 14 900 1
    13 15 500 1
    14 15 200 0
    在这里插入图片描述

查询最短路径

在这里插入图片描述
行知楼体育馆
在这里插入图片描述
文典阁逸夫楼
在这里插入图片描述
笃行南楼电化楼
在这里插入图片描述

查询所有路径

文典阁问津楼
在这里插入图片描述
文典阁艺术楼
在这里插入图片描述
教学主楼眼镜湖
在这里插入图片描述

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

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

相关文章

旅游景区景点订票售票系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于java的景区景点预约购票系统&#xff0c;整体使用javaMySql的B/S架构&#xff0c;技术上采用了springboot框架&#xff1b;通过后台添加景区资讯、景点介绍&#xff0c;管理用户订单&#xff1b;用户通过…

【WordNet】词典——omw-1.4下载

from nltk.corpus import wordnet syns wordnet.synsets("bank") print(syns[0].name())运行这段代码时&#xff0c;编译器会提示找不到【omw-1.4】这个东西 官方地址 官方NLTK网址 但是要科学上网… 分享一个已经下载好的 链接&#xff1a;https://pan.baidu.c…

【翻译】【词典】【词库】(PC版)离线词典GoldenDict+离线词库--地表最强 (by shany shang)

&#xff08;PC版&#xff09;离线词典–地表最强 一、下载 GoldenDict 客户端 &#xff08;windows&#xff09; &#xff08;1&#xff09;下载网址&#xff1a;&#xff08;点不开 &#xff0c;记得用谷歌哟&#xff09; https://sourceforge.net/projects/goldendict/fi…

quicker + Golden Dict 实现比欧陆词典更好用的免费查词翻译神器

免费、纯净无广告、界面简洁&#xff0c;Golden Dict 搭配词库文件&#xff0c;就成为桌面端的查词翻译神器。 然而有时候遇到阅读外文文档、源码注释时&#xff0c;Golden Dict 不支持整句翻译&#xff0c;不支持OCR 文字识别&#xff0c;体现了它的短板。 于是&#xff0c;…

GoldenDict 上的那些精美版权词典(附下载地址)(英语、俄语、梵语、印地语)

转载▼ 标签&#xff1a; 杂谈 国内的有道词典和金山词典由于使用方便、宣传到位得到了许多同学的喜爱。在开源软件的领域&#xff0c;也有一款非常好用的词典GoldenDict&#xff0c;它的强项在于可以直接使用众多词典厂商的词库。那些正规的词典厂商通常购买了词典的版权…

Qy词典-免费离线的中英词典

离线可用词量丰富快速精准免费开源-安全可靠界面清爽中英互译最重要的就是词库是离线文件&#xff0c;不依赖任何&#xff0c;所以可用性很高 1C币-CSDN下载链接 在我自己搭建的nginx静态文件服务器上的下载地址

欧路词典如何导入html,欧路词典怎么添加词库 管理词库的方法介绍

欧路词典电脑版的翻译功能深得广大英语学习用户的喜爱&#xff0c;很多用户在使用过程中不知道怎么添加词库&#xff0c;那么小编我今天就来为大家讲讲&#xff0c;赶快来看看下面的文章吧&#xff01; 操作步骤如下&#xff1a; 1、首先需要进入欧路词典并进行登录&#xff0c…

iPad 使用技巧:欧路词典

通常&#xff0c;欧路词典的免费版本就够用了。 比如&#xff0c;可以随意导入自己喜欢的词典&#xff0c;在应用内不仅能访问外文网页或电子文件&#xff0c;对不认识的单词可以直接点读&#xff0c;还有自带记忆曲线辅助背单词、自动列出重点单词等功能。 与其它应用起分屏使…

用什么词典可以翻译php,【欧陆词典】一款自定义词典库、支持划词翻译的万能词典...

本帖最后由 西山鹤城 于 2018-12-21 20:13 编辑 学英语的或者经常用到英语的人都知道&#xff0c;市面上最通用的某道和某山等查词软件的语料库不够完善&#xff0c;甚至释义有时候都是不太准确的&#xff0c;以网络释义居多&#xff0c;经常查一个词这些软件会给出很多资料、解…

欧路词典绿色版免费使用 v12.4.7附使用教程

欧路词典是一款具有权威的英语词典软件&#xff0c;除了支持海量扩充词库、海量词库网络词典&#xff0c;网络百科&#xff0c;第三方格式词典库&#xff0c;还有各种专业领域的词库也是一应俱全&#xff0c;而且也考虑到学生的使用环境&#xff0c;哪怕在离线环境下&#xff0…

查单词神器:欧路词典

使用背景 计算机课程的学习过程中&#xff0c;不论是英文原版书籍还是英文论坛&#xff0c;难免会遇到一些陌生的单词。身处计算机时代的我们已经不需要再拿着一本厚厚的大辞典查单词了&#xff0c;只需将自己需要翻译的单词或者句子输入到翻译软件中。即使如此&#xff0c;来…

理论计算机科学的奠基人 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 14 日&#xff0c;在 1946 年的今天&#xff0c;英国电视发明者贝尔德去世。1924 年&#xff0c;贝尔德首次展出了他制造的电视设备&#xff0c;当时他成功…

网络钓鱼仍然是安全行业的祸害

随着网络犯罪分子采用更先进的方法&#xff0c;网络钓鱼诈骗继续构成重大风险。 根据 Zscaler 最新发布的 2023 ThreatLabz 网络钓鱼报告&#xff0c;随着网络钓鱼工具包和ChatGPT等人工智能 (AI) 工具的广泛使用&#xff0c;网络犯罪分子比以往任何时候都更容易创建有针对性的…

GTO与OKR工具选择

学习用计算机编程的方法来理解管理日常生活和工作&#xff0c;例如抽象、类&#xff08;父类、子类&#xff09;、变量、属性和方法、面向对象和函数式等。通过这些理解 统筹 管理需用gtd工具&#xff08;可以看下面的使用心得&#xff09;。管自己gtd还好&#xff0c;要管一个…

《即兴演讲》

ISBN&#xff1a;978-7-5472-6572-7 作者&#xff1a;河流 页数&#xff1a;178页 阅读时间&#xff1a;2021-11-26 推荐指数&#xff1a;★★★☆☆ 让自己说话有条理&#xff0c; 演讲有技巧有公式&#xff0c; 有条不紊的讲好自己的故事。 演讲者应该认识到紧张感。 演讲者…

港联证券|央行发布大消息!热门板块卷土重来,概念股大涨

新的一周开始了&#xff0c;一起来看下上午的商场情况。今天上午&#xff0c;三大指数涨跌纷歧&#xff0c;截至午间收盘&#xff0c;沪指涨0.08%&#xff0c;深成指跌0.33%&#xff0c;创业板指跌0.68%。 板块上来看&#xff0c;AI概念东山再起&#xff0c;英伟达概念股盘中拉…

新致AI | 整合知识开放平台+软件机器人平台,推出新致人工智能平台

引言 当我们站在更长的时间维度上来看AI&#xff0c;人类系统地研究AI已有30多年的历史。从AlphaGo第一次出现在公众视野到ChatGPT的爆火&#xff0c;ChatGPT给人们带来的震撼比AlphaGo更强烈&#xff0c;人类第一次认识到AI可能会影响到每一个人的生活方式和工作方式&#xf…

新致新知 | 整合 ChatGPT 推出图谱机器人

2月13日&#xff0c;新致软件作为国内领先的软件服务提供商&#xff0c;宣布将在核心产品&#xff1a;新致分布式图谱平台——新知&#xff0c;整合ChatGPT 技术&#xff0c;提供“图谱小新机器人”。 近日&#xff0c; ChatGPT的爆火&#xff0c;正悄然引导着一场深刻的变革。…

智库时代杂志智库时代杂志社智库时代编辑部2022年第44期目录

智观天下《智库时代》投稿&#xff1a;cnqikantg126.com 产教融合视域下高等职业院校社会服务能力研究 韩炎坪1-4 新形势下我国长江中上游中小企业人力资本生态管理研究 王丽丹 马燊5-8 《公共图书馆法》实施背景下的图书交存管理工作的现状与思考 郝薇9-12 智言智语 高校学生党…

现代营销杂志现代营销杂志社现代营销编辑部2022年第11期目录

财务金融《现代营销》投稿&#xff1a;cnqikantg126.com 我国中小企业货币资金管理分析 安宁; 1-3 企业财务管理转型路径探讨 秦春; 4-6 互联网背景下电商企业税务风险研究 何秋梅; 7-9 目标成本管理在企业经济管理中的应用分析 艾蕾梅; 10-12 关于我国发展…