运维开发网

景区旅游信息管理系统的C++实现

运维开发网 https://www.qedev.com 2022-07-07 21:03 出处:网络
这篇文章主要为大家详细介绍了C++实现景区旅游信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这篇文章主要为大家详细介绍了C++实现景区旅游信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文分享了用C++实现景区旅游信息管理系统的具体代码,供大家参考。具体内容如下

1 问题描述

如今,随着生活水平的提高,每个人都喜欢在假期参观一个旅游景点。在旅游景点,游客经常被问及从一个景点到另一个景点的最短路径和最短距离。这类不喜欢按照导游图游览的游客,往往需要一个景区管理系统来选择自己喜欢的景点,然后规划一条最短的路径和最短的距离来游览,这样可以节省时间,提高旅游效率。

2 数据结构的设计

建立景区旅游信息管理系统,实现以下功能:

1.创建景点分布图。

通过一个邻接矩阵(本质上是一个二维数组,m[i][j]表示从I到j的权重,0表示没有直接路径)记录景点分布图。

2.输出景点分布图(邻接矩阵)

扫描邻接矩阵,输出景点分布图。

3.出口导游路线图:深度优先策略。

首先,通过遍历景点,通过用户给定的入口景点C,建立导游路线图,导游路线图用有向图表示。采用深度优先策略(递归)也是游客的正常心理。

4.判断导游线路图是否存在环路:拓扑排序(寻找渗透率大于1的景点)。

为了优化导游线路图,可以通过拓扑排序来判断地图中是否存在环路,如果存在环路,则打印出环路中的景点进行人工优化。

5.求两个景点之间的最短路径和最短距离:floyd算法

在导游线路图中,还为一些不想按路线走的游客提供了信息服务,比如从一个景点到另一个景点的最短路径、最短距离等。这个线路图中会输出任意景点之间的最短路径和最短距离。

6.输出道路施工计划:质数算法

在景区建设中,道路建设是重要内容之一。道路建设首先要保证所有景点都能连通,但花费最少。这个问题可以通过求最小生成树来解决,最小生成树可以通过素数算法
来求。通过修改和增加的功能:

7.安装指定的景点分布图文件名(可以以景点命名),保存在默认目录文件
。这里遇到一个路径格式问题,通过查询资料解决了。

8.从默认目录文件中读取指定文件名的景点分布图。

这样减少了每次创建景点分布图的需要,也方便将已有的景点分布图导入到系统中,而不是手动新建,在实际应用中更加方便和人性化。

9.在当前景点中添加景点道路。

一开始并没有清理景点的路径,以至于在添加景点道路后,新导入了景点较少的景点分布图,而在添加景点道路时,发现之前的道路仍然存在,所以在添加景点道路之前,要清理道路景点。

3 算法设计(核心代码)//深度优先搜索导游线路int visited[M]={0};int np=0;//找到的景点个数int p[M];//表示各个景点的入度值void DFS(int c){ //c为景点编号 np++;//每递归调用一次就自加一次,作为判断是否到了最后一个景点 p[c]++; if(np==S.count){ //到了最后一个景点 coutlt;lt;S.mat.Pname[c]lt;lt;endl; returnMainFace(); }else{ coutlt;lt;S.mat.Pname[c]lt;lt;"--gt;"; } visited[c]=1; for(int i=0;ilt;S.count;i++){ if(S.mat.m[c][i]gt;0amp;amp;visited[i]==0){ DFS(i); if(S.countgt;np){ coutlt;lt;S.mat.Pname[c]lt;lt;"--gt;"; p[c]++; } } } if(np==S.count) returnMainFace();}void guide_line()//导游线路{ checked(); coutlt;lt;"\n*请输入起始景点的景点编号:"; int c; cingt;gt;c; c--; for(int i=0;ilt;S.count;i++){ visited[i]=0; p[i]=0;//入度置初值为0 } np=0; coutlt;lt;"*形成的导游线路图(采取深度优先策略)如下所示:\n\n\t"; DFS(c);}//Floyd(佛洛依德)算法,A[M][M]表示最短距离,path[M][M]表示辅助数组,记住前驱void Floyd(int A[M][M],int path[M][M]){ int i,j,k; for(i=0;ilt;S.count;i++){ for(j=0;jlt;S.count;j++){ if(S.mat.m[i][j]==0amp;amp;i!=j){ //如果两点之间没有边相连,则权为无穷大 A[i][j]=INF;//INF=999666333 }else if(i==j){ A[i][j]=0; }else{ //S.mat.m[i][j]表示两个景点之间的道路长度 A[i][j]=S.mat.m[i][j]; } //给所有的path[i][j]赋值 if(i!=jamp;amp;S.mat.m[i][j]lt;INF){ path[i][j]=i; }else{ //(i==jamp;amp;S.mat.m[i][j]=INF path[i][j]=-1; } } } //k注意放到最外层,让A[i][j]检测都经过每一个k for(k=0;klt;S.count;k++){ for(i=0;ilt;S.count;i++){ for(j=0;jlt;S.count;j++){ if(A[i][j]gt;A[i][k]+A[k][j]){//如果i-gt;j的权值大于i-gt;k-gt;j的权值 A[i][j]=A[i][k]+A[k][j]; path[i][j]=path[k][j];//path[k][j]=k前驱k是指向的下一个景点 } } } }}void min_distance()//最短路径、距离{ checked(); int A[M][M],path[M][M]; Floyd(A,path);//A是一个景点到另一个景点的最短路径的长度 while(true){ Num_Name();//编号对应的景点名称 int i,j,k,s; int apath[M],d;//apath[M]是记录路径的数组 bool flag=true; while(flag){ coutlt;lt;"\t-景点1:"; cingt;gt;i; i--; if(ilt;0||igt;S.count-1){ coutlt;lt;"*请输入合法的景点编号:\n"; }else{ flag=false; } } flag=true; while(flag){ coutlt;lt;"\t-景点2:"; cingt;gt;j; j--; if(jlt;0||jgt;S.count-1){ coutlt;lt;"*请输入合法的景点编号:\n"; }else{ flag=false; } } if(A[i][j]lt;INFamp;amp;i!=j){ k=path[i][j];//k是指向的下一个景点 d=0;//路径有d+2个景点,是数组apath的下标 //将待输出的路径的点存放在栈apath中 apath[d]=j;//最后一个景点 while(k!=-1amp;amp;k!=i){ d++; apath[d]=k; //再继续判断还有没有景点 k=path[i][k]; } d++; apath[d]=i;//加上第一点 coutlt;lt;"\n*从 "lt;lt;S.mat.Pname[i]lt;lt;" 到"lt;lt;S.mat.Pname[j]lt;lt;" 最短路径为:"; coutlt;lt;S.mat.Pname[apath[d]];//apath[M]数组最后一个,就是第一个起点,相当于栈 for(s=d-1;sgt;=0;s--){//将剩下的景点(apath[M]数组剩下的元素)打印出来 coutlt;lt;"--gt;"lt;lt;S.mat.Pname[apath[s]]; } coutlt;lt;" ,最短距离为:"lt;lt;A[i][j]lt;lt;endl;//Floyd算法已经将最短路径算出来存放到了A[i][j](将INF的值用最短路径代替了) }else if(i==j){ coutlt;lt;"\n*景点输入不合法,输入的两个景点不能相同!\n"; }else{ coutlt;lt;"\n*这两个景点间不存在路径\n"; } coutlt;lt;"\n是否继续执行最短路径和最短距离的查询(Y/N)"; Y_N(); } returnMainFace();}//道路修建规划图、最小生成树(prime算法)void build_road(){ checked(); coutlt;lt;"\n*道路修建规划图(prime算法)规划如下:\n"; //Ai[M]表示待选边的权值,邻接矩阵的一行,closest[M]:点编号数组,记录下一条路的起点景点的编号 intAi[M],min,closest[M],i,j,k,sum=0,num=0;//num表示第几条路 int A[M][M]; //赋权值 for(i=0;ilt;S.count;i++){ for(j=0;jlt;S.count;j++){ if(S.mat.m[i][j]==0amp;amp;i!=j){ A[i][j]=INF; }else if(i==j){ A[i][j]=0; }else{ A[i][j]=S.mat.m[i][j]; } } } for(i=0;ilt;S.count;i++){ Ai[i]=A[0][i];//取第一行存四个Ai[i],就是一个景点到所有景点的权值 closest[i]=0;//0 } for(i=1;ilt;S.count;i++){ min=INF; //从Ai[j]中选出最小的值存放在min for(j=0;jlt;S.count;j++){ if(Ai[j]!=0amp;amp;Ai[j]lt;min){ min=Ai[j]; k=j;//记录最小的值的列j:k=j,为了下面标志此路已选 } } if(minlt;INF){ coutlt;lt;"\t-第 "lt;lt;++numlt;lt;" 条路: 从"lt;lt;S.mat.Pname[closest[k]]lt;lt;" 到"lt;lt;S.mat.Pname[k]lt;lt;" , 该道路长度为:"lt;lt;minlt;lt;endl; sum+=min;//sum累计道路长度,即是已选的权值 } Ai[k]=0;//标志为已选的边的权值,避免重复选择 //例子:对比a到c和b到c的权值,取最小存进Ai[j]中 for(j=0;jlt;S.count;j++){ if(A[k][j]!=0amp;amp;A[k][j]lt;Ai[j]){ Ai[j]=A[k][j]; closest[j]=k;//点编号数组,记录下一条路的起点景点的编号 } } } coutlt;lt;"*修建道路的总长度为:"lt;lt;sumlt;lt;endl; returnMainFace();}4 运行与测试

通过创建不同的景点分布图进行测试,测试结果是正确的。

5 总结与心得

通过认真对待数据结构的课程设计,认真思考如何利用算法和代码解决现实生活中的问题,认真参考优秀的参考文献和优秀的作品,我们收获颇丰。起初,面对现实生活中的问题,我不知道如何解决现实生活中的问题。后来通过参考文献和其他人的类似作品,我才发现原来的数据结构算法是这样使用的,从而解决了之前在数据结构类中的困惑:如何将数据结构应用到我们的工作代码中。总的来说,我们收获很大。只要认真对待学习的每一步,一定会有所收获。

通过老师的指导,这个系统得到了很大的优化,我也学到了很多。许多实际问题还没有考虑透彻。老师可以指出来让我修改。正是因为修订,我学到了更多的知识,让我明白了课程设计不仅仅是课程设计,更是通过这个课程设计,不断优化,考虑实际问题。

这就是本文的全部内容。希望对大家的学习有帮助

0

精彩评论

暂无评论...
验证码 换一张
取 消