9、校园导游咨询问题描述:设计一个校园导游程序,为来访的客人提供各种信息查询服务。
基本要求:⑴设计华东交通大学的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,⑵存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
⑶为来访客人提供图中任意景点相关信息的查询。
⑷为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
#include <stdio.h>#define MAXV 100 //最大顶点个数#define INF 32767 //用32767表示∞#include <stdlib.h> //调用函数system改变字体颜色的头文件typedef int InfoType;#define MAXV 100 //最大顶点个数//以下定义邻接矩阵类型typedef struct{ int no; //顶点编号InfoType info; //顶点其他信息} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵int vexnum,arcnum; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息} MGraph;void ecjtumap()//建立华东交通大学地图{ printf("\t|-------------------------------------------------------------|\n");printf("\t| |\n");printf("\t| |\n");printf("\t| ---------- |\n");printf("\t| ==============================| 国防生宿舍| |\n");printf("\t| 。
---------- |\n");printf("\t| 。
|\n");printf("\t| 。
|\n");printf("\t| 。
|\n");printf("\t| 。
|\n");printf("\t| 。
|\n");printf("\t| |南区四食堂| ---------- |\n");printf("\t| 。
|南区礼堂| |\n");printf("\t| 。
---------- |\n");printf("\t| 。
|\n");printf("\t| 。
|\n");printf("\t| 。
-------- 。
|\n");printf("\t| ================| 校训牌|。
|\n");printf("\t| = -------- |\n");printf("\t| = 。
|\n");printf("\t| = 。
|\n");printf("\t| -------- --------- |\n");printf("\t|----| 南区后门|---------| 南区大门|------------------------|\n");printf("\t| -------- --------- |\n");printf("\t| --------- |\n");printf("\t|-------------------------| 北区大门|------------------------|\n");printf("\t| -------- |\n");printf("\t| 。
-------------- |\n");printf("\t| ===========================| 15栋综合教学楼| |\n");printf("\t| = -------------- |\n");printf("\t| = 。
|\n");printf("\t| = 。
|\n");printf("\t| = 。
|\n");printf("\t| = 。
|\n");printf("\t| = ---------- |\n");printf("\t| ===============================| 经管食堂| |\n");printf("\t| = ---------- |\n");printf("\t| = = |\n");printf("\t| = = |\n");printf("\t| ----------- = |\n");printf("\t| |轨道交通食堂|====================| 学生宿舍| |\n");printf("\t| ------------ |\n");printf("\t| |\n");printf("\t|-------------------------------------------------------------|\n");printf("\n");}void DispMat(MGraph g) //输出邻接矩阵g,即输出地图各景点的图的距离{ int i,j;for (i=0;i<g.vexnum;i++){for (j=0;j<g.vexnum;j++)if (g.edges[i][j]==INF)printf("%3s","∞"); //这里分别用%3s和%3d控制输出字符∞或数字宽度为3个字符else printf("%3d",g.edges[i][j]); //这样比较方便观看景点的图的邻接矩阵g printf("\n");}}void listmap()//建立景点的相关信息的总浏览表{ printf("\t 华东交通大学景点一览\n\n");printf("\t|---------------------------------------|\n");printf("\t| 1:南区大门|\n");printf("\t|---------------------------------------|\n");printf("\t| 2:校训牌|\n");printf("\t|---------------------------------------|\n");printf("\t| 3:图书馆|\n");printf("\t|---------------------------------------|\n");printf("\t| 4:南区一食堂|\n");printf("\t|---------------------------------------|\n");printf("\t| 5:孔目湖|\n");printf("\t|---------------------------------------|\n");printf("\t| 6:北区大门|\n");printf("\t|---------------------------------------|\n");printf("\t| 7:15栋教学楼|\n");printf("\t|---------------------------------------|\n");printf("\t| 8:北区食堂|\n");printf("\t|---------------------------------------|\n");printf("\t| 9:科技楼|\n");printf("\t|---------------------------------------|\n");printf("\t| 10:北区篮球场|\n");printf("\t|---------------------------------------|\n");}void introduce()//根据上面的浏览表,对应出相关信息{ int a=1;printf("\n");printf("请输入要查看的景点:\n");printf("输入1~10的数字选择景点,其他数字返回上一级\n");while(0<a&&a<=10){ scanf("%d",&a);switch(a){case 1:printf("1:南区大门是进入华东交通大学南区的正门\n");break;case 2:printf("2:校训牌是激励我们大学生积极向上\n");break;case 3:printf("3:图书馆是给我们大学生丰富知识的海洋\n");break;case 4:printf("4:南区一食堂是南区学生的吃饭的地方\n");break;case 5:printf("5:孔目湖是华东交通大学最迷人的地方\n");break;case 6:printf("6:北区大门是进入华东交通大学北区的正门\n");break;case 7:printf("7:15栋教学楼是一栋综合型的教学楼\n");break;case 8:printf("8:北区食堂是北区学生吃饭的地方\n");break;case 9:printf("9:科技楼是大学生上机做实验的教学楼\n");break;case 10:printf("10:北区篮球场是大学生锻炼身体的地方\n");break;}}}void show_didian(int n)//根据算法求出的整型数,对应出地点//根据xx算法求出的数字,转化为文字描述{ switch(n){case 0:printf("1.南区大门");break;case 1:printf("2.校训牌");break;case 2:printf("3.图书馆");break;case 3:printf("4.南区一食堂");break;case 4:printf("5.孔目湖");break;case 5:printf("6.北区大门");break;case 6:printf("7.15栋教学楼");break;case 7:printf("8.北区食堂");break;case 8:printf("9.科技楼");break;case 9:printf("10.北区篮球场");break;}}void ppath(int path[][MAXV],int i,int j) //求最短路径经过的地点{ int k=path[i][j];if (k==-1) return;ppath(path,i,k);show_didian(k);printf("->> ");ppath(path,k,j);}void put_shortdistance(int x,int y,int A[][MAXV],int path[][MAXV],int n){ int i,j;for (i=0;i<n;i++)for (j=0;j<n;j++)if (A[i][j]==INF){if (i!=j) printf("从%d到%d没有路径\n",i,j);}else{if(i==x&&j==y){ printf("最短路径为:从-- ");show_didian(i);printf(" -- 到--");show_didian(j);printf(" -- 路径为-- :\n");show_didian(i);//输出起点printf("->>");ppath(path,i,j);//求最短路径经过的中间路径,若没有则不输出show_didian(j);//输出终点printf("\n\t路径长度为:%d\n",A[i][j]);}}}void shortdistance(MGraph g,int x,int y) //求最短路径用的是弗洛伊德算法{ int A[MAXV][MAXV],path[MAXV][MAXV];//path为中间路径不包括起点终点int i,j,k,n=g.vexnum;for (i=0;i<n;i++) //给A数组置初值for (j=0;j<n;j++){A[i][j]=g.edges[i][j]; path[i][j]=-1;}for (k=0;k<n;k++) //计算Ak{for (i=0;i<n;i++)for (j=0;j<n;j++) //这里的3个for循环if (A[i][j]>(A[i][k]+A[k][j])) //所以时间复杂度O(n3){A[i][j]=A[i][k]+A[k][j]; path[i][j]=k;}}put_shortdistance(x,y,A,path,n);}void menu(MGraph g)//建立菜单页面,可以无数次选择菜单,当输入5时退出系统{ int m=1,x=1,y=1; //m的菜单选择的功能x,y分别表示从x到y的问路查询while(m!=5){ printf("\t\t\t|------------------------|\n");printf("\t\t\t|----------菜单----------|\n");printf("\t\t\t| 1:查看地图|\n");printf("\t\t\t| 2:地图详解|\n");printf("\t\t\t| 3:景点一览表|\n");printf("\t\t\t| 4:问路查询|\n");printf("\t\t\t| 5:退出|\n");printf("\t\t\t|------------------------|\n");printf("请输入1~5的数字\n");scanf("%d",&m);switch(m){case 1:ecjtumap();break;case 2:listmap();introduce();break;case 3:listmap();introduce();printf("\n"); break;case 4:listmap();printf("请输入起点:");scanf("%d",&x);x+=-1;printf("请输入终点:");scanf("%d",&y);y+=-1;shortdistance(g,x,y);break;case 5:printf("\t\t\t感想使用本系统,欢迎下次继续使用\n");break;}}}void main(){ system("color 0a");//输出字体为绿色int i,j; MGraph g;int A[MAXV][10]={{INF, 1,INF,INF,INF, 1,INF,INF,INF,INF},{ 1,INF, 5, 6, 7,INF,INF,INF,INF,INF},{INF, 5,INF,INF, 2,INF,INF,INF,INF,INF},{INF, 6,INF,INF, 5,INF,INF,INF,INF,INF},{INF, 7, 2, 5,INF,INF,INF,INF,INF,INF},{ 1,INF,INF,INF,INF,INF, 3,INF, 5,INF},{INF,INF,INF,INF,INF, 3,INF, 2,INF,INF},{INF,INF,INF,INF,INF,INF, 2,INF, 8, 10},{INF,INF,INF,INF,INF, 5,INF, 8,INF, 2},{INF,INF,INF,INF,INF,INF,INF, 10, 2,INF}};g.vexnum=11;g.arcnum=11;for (i=0;i<g.vexnum;i++)//把点的图的邻接矩阵传赋值给gfor (j=0;j<g.vexnum;j++)g.edges[i][j]=A[i][j];printf("\n"); printf("\t\t\t华东交通大学导游咨询系统\n");menu(g);//进入导游系统,执行菜单功能}。