您好,欢迎来到智榕旅游。
搜索
您的当前位置:首页数据结构与OOP景区旅游信息管理系统-

数据结构与OOP景区旅游信息管理系统-

来源:智榕旅游
/*

15、景区旅游信息管理系统 【问题描述】 在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游图的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线路策略和制订景区道路铺设策略。

任务中景点分布是一个无向带权连通图,图中边的权值是景点之间的距离。

(1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路图,导游线路图用有向图表示。遍历采用深度优先策略,这也比较符合游客心理。

(2)为了使导游线路图能够优化,可通过拓朴排序判断图中有无回路,若有回路,则打印输出回路中的景点,供人工优化。

(3)在导游线路图中,还为一些不愿按线路走的游客提供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路图中将输出任意景点间的最短路径和最短距离。

(4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树(prime,克鲁斯卡尔)来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。 【基本要求】 本任务应有如下功能模块: 创建景区景点分布图;

输出景区景点分布图(邻接矩阵) 输出导游线路图;深度优先策略

判断导游线路图有无回路;拓朴排序(查找入度大于1的景点) 求两个景点间的最短路径和最短距离;弗洛伊德算法 输出道路修建规划图。prime

主程序用菜单选项供用户选择功能模块。 */

论文内容包括: 一、 课程设计题目: 二、 课程设计内容: 三、 算法设计:

四、 程序正确性验证(指边界测试数据,即程序对于精心选择的典型、苛刻

而带有难性的几组输入数据能够得出满足要求的结果): 五、 课程设计过程中出现的主要问题、原因及解决方法: 六、 课程设计的主要收获:

七、 对今后课程设计的建议:

//代码:

#include using namespace std; #include//getch

#include//清屏函数头文件

#define M 100

#define INF 999666333

/**函数声明**/

void Welcome();//欢迎界面

void returnMainFace();//返回主界面函数 void MainFace();//主界面

void create_graph();//创建景区景点图 void print_graph();//输出景区景点图 void guide_line();//导游线路

void DFS(int c);//深度优先搜索导游线路

void checked();//检查是否存在一个合法的景区景点分布图 void Num_Name();//打印景点编号与景点名称的对应信息 void Floyd(int A[M][M],int path[M][M]);//Floyd算法 void Y_N();//选项判断函数 void check_circuit();//判断回路

/**定义数据结构**/ struct Matrix {

int m[M][M];//景点邻接矩阵

string Pname[M];//各个景点的名称 };

typedef struct {

string Sname;//景区名称 int count;//景点总数量 int edge;//道路数量 Matrix mat;//邻接矩阵 }Scenic;

/**景区数据类型为全局变量**/

Scenic S;

/***************************/

//创建一个景区邻接矩阵 void create_graph() {

if(S.count>0) {

cout<<\"\\n*当前已存在一个景区景点分布图!\\n*继续操作将覆盖该景区景点分布图!(Y/N)\"; Y_N(); }

cout<<\"\\n*请输入景区的名称:\"; cin>>S.Sname;

cout<<\"\\n*请输入该景区的景点总数目:\"; cin>>S.count;

cout<<\"\\n*请输入景区的道路总数目:\"; cin>>S.edge; int i,j;

for(i=0;ifor(j=0;jS.mat.m[i][j]=0; } }

cout<<\"\\n*请输入道路两边连接的两个景点编号、名称及道路的长度\\n\";

cout<<\"\(格式:景点输入请按照小号在前大号在后的原则,景点编号从1开始)\"; for(i=0;icout<<\"\\n*第 \"<//编号输入从1开始,矩阵下标从零开始 cout<<\"\-景点 1 编号:\"; cin>>n1; n1--;

cout<<\"\-景点 1 名称:\"; cin>>S.mat.Pname[n1];

cout<<\"\-景点 2 编号:\"; cin>>n2; n2--;

cout<<\"\-景点 2 名称:\"; cin>>S.mat.Pname[n2];

cout<<\"\-两景点之间的道路长度:\"; cin>>S.mat.m[n1][n2];

S.mat.m[n2][n1]=S.mat.m[n1][n2]; }

cout<<\"\\n*景区创建成功!\"; returnMainFace(); }

void print_graph()//以邻接矩阵的形式输出景点分布 {

checked();

cout<<\"\\n*景区景点分布图(邻接矩阵表示)查询成功!\\n\"; cout<<\"*景区名称:\"<cout<<\"\\n\ -----\"; for(i=0;icout<<\"---\"; }

cout<cout<<\"\|编号|\"; //cout<<\" |\"

for(i=0;icout<<' '<cout<<'|'<cout<<\"---\"; }

cout<<'|'<for(i=0;ifor(j=0;jif(j==0) {

cout<<\"\| \"<cout<<' '<} }

cout<<'|'<cout<<\"\ -----\";

for(i=0;icout<<\"---\"; }

Num_Name(); cout<<\"注:\\n\'0'表示两个景点间没有直接到达的路径,或景点到自身路径不需要!\\n\"; returnMainFace(); }

/********/

//深度优先搜索导游线路 int visited[M]={0};

int np=0;//找到的景点个数

int p[M];//表示各个景点的入度值 void DFS(int c) {

np++; p[c]++;

if(np==S.count) {

cout<cout< \"; visited[c]=1;

for(int i=0;iif(S.mat.m[c][i]>0&&visited[i]==0) {

DFS(i);

if(S.count>np) {

cout<\"; p[c]++; } } }

if(np==S.count)returnMainFace();

}

void guide_line()//导游线路 {

checked();

cout<<\"\\n*请输入起始景点的景点编号:\"; int c; cin>>c; c--;

for(int i=0;ivisited[i]=0;

p[i]=0;//入度置初值为0 }

np=0;

cout<<\"*形成的导游线路图(采用深度优先策略)如下所示:\\n\\n\\"; DFS(c); }

/********/

void check_circuit()//判断回路 {

checked(); if(np==0) {

cout<<\"\\n*缺少合法的导游线路图!\\n*请先生成一个合法的导游线路图!\\n\"; returnMainFace(); }

bool f=true;

for(int i=0;iif(p[i]>1) {

if(f) {

cout<<\"\\n*该导游线路图存在回路\\n线路中的重复走过的景点显示如下:\\n\\";

f=false; }

cout<<\"编号:\"<cout<<\"\\n\*未找到存在于该导游线路图中的回路。\\n\"; }

returnMainFace(); }

void Floyd(int A[M][M],int path[M][M]) {

int i,j,k;

for(i=0;ifor(j=0;jif(S.mat.m[i][j]==0&&i!=j) A[i][j]=INF; else if(i==j) A[i][j]=0; else

A[i][j]=S.mat.m[i][j]; if(i!=j&&S.mat.m[i][j]path[i][j]=-1; } } /*

for(i=0;ifor(j=0;jcout<cout<for(k=0;kfor(i=0;ifor(j=0;jif(A[i][j]>A[i][k]+A[k][j]) {

A[i][j]=A[i][k]+A[k][j]; path[i][j]=path[k][j];

} } } } /*

for(i=0;ifor(j=0;jcout<cout</********/

void min_distance()//最短路径、距离 {

checked();

//int A[M][M],path[M][M]; int path[M][M]; int A[M][M]; Floyd(A,path); //Dispath while(true) {

system(\"cls\"); Num_Name(); int i,j,k,s;

int apath[M],d;

cout<<\"*请输入要查询的最短路径和最短距离的两个景点的编号:\\n\"; cout<<\"\-景点 1:\"; cin>>i; i--;

cout<<\"\-景点 2:\"; cin>>j; j--;

if(A[i][j]cout<<\"\\n*从 \"<k=path[i][j]; d=0;apath[d]=j;

while(k!=-1&&k!=i) {

d++;apath[d]=k; k=path[i][k]; }

d++;apath[d]=i;

cout<=0;s--) {

cout<<\" --> \"<cout<<\" ,最短距离为:\"<else if(i==j) {

cout<<\"\\n*景点编号输入不合法!\\n\"; } else {

cout<<\"\\n*这两个景点间不存在路径\\n\"; }

cout<<\"\\n是否继续执行最短路径和最短距离的查询(Y/N)\"; Y_N(); }

returnMainFace(); }

void build_road()//道路修建规划图、最小生成树(prime算法) {

//Prim checked();

cout<<\"\\n*道路修建规划图(prime算法)规划如下:\\n\"; int lowcost[M],min,closest[M],i,j,k,v=0,sum=0,num=0; int A[M][M];

for(i=0;ifor(j=0;jif(S.mat.m[i][j]==0&&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;ilowcost[i]=A[v][i]; closest[i]=v; }

for(i=1;imin=INF;

for(j=0;jif(lowcost[j]!=0&&lowcost[j]min=lowcost[j]; k=j; } }

if(mincout<<\"\-第 \"<<++num<<\" 条路:从 \"<lowcost[k]=0;

for(j=0;jif(A[k][j]!=0&&A[k][j]lowcost[j]=A[k][j]; closest[j]=k; } } }

cout<<\"*修建道路的总长度为:\"<void MainFace()//主界面 {

system(\"cls\");

cout<<\"\\n主菜单:\\n\";

cout<<\"\1、创建景区景点分布图;\\n\";

cout<<\"\2、输出景区景点分布图(邻接矩阵);\\n\"; cout<<\"\3、输出导游线路图;\\n\";

cout<<\"\4、判断导游线路图有无回路;\\n\";

cout<<\"\5、求两个景点间的最短路径和最短距离;\\n\"; cout<<\"\6、输出道路修建规划图;\\n\"; cout<<\"\0、退出。\\n\";

cout<<\"\\n*请输入操作选择:\"; char c; c=getch();

cout<while(!(c>='0'&&c<='6')) {

cout<<\"*输入有误,请重新输入:\"; c=getch();

cout<switch(c) {

case '1':

create_graph();break; case '2':

print_graph();break; case '3':

guide_line();break;//导游线路 case '4':

check_circuit();break;//判断回路 case '5':

min_distance();break;//最短距离 case '6':

build_road();break;//最小生成树 case '0':

cout<<\"\\n\\\*按任意键关闭本系统*\\n\"; exit(0); } }

void returnMainFace() {

cout<<\"\\n\\\按任意键返回主菜单... ...\"; getch();

system(\"cls\"); MainFace(); }

void Welcome() {

cout<<\"\\n\\n\\******欢迎使用景区旅游信息管理系统******\\n\\n\"; cout<<\" \ \ \ 按任意键进入系统... ...\"; getch(); MainFace(); }

void checked() {

system(\"cls\"); if(S.count<=1) {

cout<<\"\\n*缺少合法的景区景点分布图!\\n*请先创建一个合法的景区景点分布图!\\n\";

returnMainFace(); } }

void Num_Name() {

cout<<\"\\n*编号对应景点名称:\\n\"; for(int i=0;icout<<\"\\"<void Y_N() {

char ch;

while(ch=getch()) {

if(ch=='Y'||ch=='y') {

cout<if(ch=='N'||ch=='n') {

cout<} }

int main() {

Welcome(); return 0; }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- zrrp.cn 版权所有 赣ICP备2024042808号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务