课题五:校园导游程序1)问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
2)基本要求(1)查询各景点的相关信息;(2)查询图中任意两个景点间的最短路径。
(3)能够将图的信息保存到文件中,并指定文件打开。
(4)增加、删除、更新有关景点和道路的信息。
附加难度:有余力的同学可以考虑用图形界面实现寻址的过程3) 设计思想核心数据结构定义一个图,将图保存后,对图进行面向指定节点到各个节点的最短路径的操作。
可以再文件中保存多个导游图,例如保存学校图、芜湖市图等文件。
开始时选择文件,将指定文件中的信息导入到内存的图中。
#define Infinity 1000#define MaxVertexNum 35#define MAX 40#include<fstream>#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include<iostream.h>typedef struct arcell //边的权值信息{int adj; //权值}arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; //图的邻接矩阵类型typedef struct vexsinfo //顶点信息{int position; //景点的编号char name[32]; //景点的名称char introduction[256]; //景点的介绍}vexsinfo;typedef struct mgraph //图结构信息{vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)adjmatrix arcs; //邻接矩阵int vexnum,arcnum; //分别指定顶点数和边数}mgraph;//全局变量int visited[35]; //用于标志是否已经访问过int d[35]; //用于存放权值或存储路径顶点编号mgraph campus; //图变量(大学校园)// (1) 对图初始化mgraph initgraph(){int i=0,j=0;mgraph c;c.vexnum =28; //顶点个数c.arcnum =39; //边的个数for(i=0;i<c.vexnum ;i++) //依次设置顶点编号c.vexs[i].position =i;//依次输入顶点信息strcpy(c.vexs[0].name ,"正门: ");strcpy(c.vexs[0].introduction ,"学校大门,离公交站很近""|r\n");strcpy(c.vexs[1].name ,"学校后门门: ");strcpy(c.vexs[1].introduction ,"去往新区、学校班车进出口");strcpy(c.vexs[2].name ,"人文学院: ");strcpy(c.vexs[2].introduction ,"人文学院办公楼的住处,楼高3层");strcpy(c.vexs[3].name ,"管理学院: ");strcpy(c.vexs[3].introduction ,"MBA培训中心,楼高7层");strcpy(c.vexs[4].name ,"行政楼: ");strcpy(c.vexs[4].introduction ,"行政办公大楼,楼高5层");strcpy(c.vexs[5].name,"建设银行: ");strcpy(c.vexs[5].introduction ,"学生取款处,楼高1层");strcpy(c.vexs[6].name ,"体育馆: ");strcpy(c.vexs[6].introduction ,"室内各类球类运动");strcpy(c.vexs[7].name,"外语学院: ");strcpy(c.vexs[7].introduction ,"各种外语教学,楼高6层");strcpy(c.vexs[8].name ,"双馨园食堂: ");strcpy(c.vexs[8].introduction ,"学生就餐地点");strcpy(c.vexs[9].name, "博学楼: ");strcpy(c.vexs[9].introduction , "计算机科学与技术学院大楼,楼高13层"); strcpy(c.vexs[10].name ,"学生宿舍: ");strcpy(c.vexs[10].introduction ,"若干栋,离中山园食堂近");strcpy(c.vexs[11].name ,"中山园食堂: ");strcpy(c.vexs[11].introduction ,"学生就餐处");strcpy(c.vexs[12].name ,"图书馆: ");strcpy(c.vexs[12].introduction ,"历史悠久,文化气氛好");strcpy(c.vexs[13].name ,"法学楼: ");strcpy(c.vexs[13].introduction ,"研修法学佳地");strcpy(c.vexs[14].name ,"贵大学生超市: ");strcpy(c.vexs[14].introduction ,"买各种日用品的地方");strcpy(c.vexs[15].name ,"大礼堂: ");strcpy(c.vexs[15].introduction ,"文艺演出所在地");strcpy(c.vexs[16].name ,"慎思楼(新图书馆): ");strcpy(c.vexs[16].introduction ,"自习的好地方");strcpy(c.vexs[17].name ,"逸夫楼: ");strcpy(c.vexs[17].introduction ,"经济学院办公楼");strcpy(c.vexs[18].name ,"文化书院: ");strcpy(c.vexs[18].introduction ,"推动东西方文化交流的重要桥梁");strcpy(c.vexs[19].name ,"派出所: ");strcpy(c.vexs[19].introduction ,"保卫学校安全");strcpy(c.vexs[20].name ,"贵州大学出版社: ");strcpy(c.vexs[20].introduction ,"发行各种图书");strcpy(c.vexs[21].name ,"贵州大学网球场: ");strcpy(c.vexs[21].introduction ,"打网球的地方");strcpy(c.vexs[22].name ,"化工学院: ");strcpy(c.vexs[22].introduction ,"各种实验的研究之地");strcpy(c.vexs[23].name ,"贵州大学高等教育研究所: ");strcpy(c.vexs[23].introduction ,"关于高等教育的各种研究");strcpy(c.vexs[24].name ,"花溪海洋学校: ");strcpy(c.vexs[24].introduction ,"贵大内部学校");strcpy(c.vexs[25].name ,"贵州大学党校: ");strcpy(c.vexs[25].introduction ,"党员学习的地方");strcpy(c.vexs[26].name ,"校医院: ");strcpy(c.vexs[26].introduction ,"看小病的地方");strcpy(c.vexs[27].name ,"体育场: ");strcpy(c.vexs[27].introduction ,"田径远动地点");//依次输入边上的权值信息for(i=0;i<c.vexnum ;i++)for(j=0;j<c.vexnum ;j++)c.arcs [i][j].adj =Infinity; //先初始化图的邻接矩阵//部分弧长c.arcs[0][2].adj=50; c.arcs[0][3].adj=60;c.arcs[1][4].adj=90;c.arcs[2][3].adj=60; c.arcs[2][8].adj=40;c.arcs[3][4].adj=60; c.arcs[3][6].adj=40;c.arcs[4][5].adj=70; c.arcs[4][9].adj=70; c.arcs[4][10].adj=80;c.arcs[4][17].adj=200;c.arcs[5][7].adj=70;c.arcs[6][9].adj=40;c.arcs[7][18].adj=190;c.arcs[8][11].adj=50;c.arcs[9][12].adj=40;c.arcs[10][18].adj=70;c.arcs[11][12].adj=60; c.arcs[11][14].adj=50; c.arcs[11][15].adj=50;c.arcs[12][16].adj=50;c.arcs[13][14].adj=40; c.arcs[13][22].adj=60;c.arcs[14][15].adj=50; c.arcs[14][20].adj=90;c.arcs[15][16].adj=60; c.arcs[15][21].adj=40;c.arcs[16][17].adj=60;c.arcs[17][18].adj=80;c.arcs[18][19].adj=60;c.arcs[20][21].adj=60; c.arcs[20][24].adj=80;c.arcs[22][23].adj=60; c.arcs[22][25].adj=80;c.arcs[23][24].adj=60;c.arcs[24][26].adj=100; c.arcs[24][27].adj=100;c.arcs[25][26].adj=90;c.arcs[26][27].adj=90;for(i=0;i<c.vexnum ;i++) //邻接矩阵是对称矩阵,对称赋值for(j=0;j<c.vexnum ;j++)c.arcs[j][i].adj =c.arcs[i][j].adj ;FILE * pFile;pFile = fopen ("myfile.txt","w");fwrite(c.vexs[0].name,2,3,pFile);fwrite(c.vexs[0].introduction,2,11,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[1].name,2,6,pFile);fwrite(c.vexs[1].introduction,2,12,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[2].name,2,5,pFile);fwrite(c.vexs[2].introduction,2,15,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[3].name,2,5,pFile);fwrite(c.vexs[3].introduction,2,10,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[4].name,2,4,pFile);fwrite(c.vexs[4].introduction,2,11,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[5].name,2,5,pFile);fwrite(c.vexs[5].introduction,2,10,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[6].name,2,4,pFile);fwrite(c.vexs[6].introduction,2,8,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[7].name,2,5,pFile);fwrite(c.vexs[7].introduction,2,11,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[8].name,2,6,pFile);fwrite(c.vexs[8].introduction,2,6,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[9].name,2,4,pFile);fwrite(c.vexs[9].introduction,2,17,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[10].name,2,5,pFile);fwrite(c.vexs[10].introduction,2,11,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[11].name,2,6,pFile);fwrite(c.vexs[11].introduction,2,5,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[12].name,2,4,pFile);fwrite(c.vexs[12].introduction,2,10,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[13].name,2,4,pFile);fwrite(c.vexs[13].introduction,2,6,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[14].name,2,7,pFile);fwrite(c.vexs[14].introduction,2,9,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[15].name,2,4,pFile);fwrite(c.vexs[15].introduction,2,7,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[16].name,2,10,pFile); fwrite(c.vexs[16].introduction,2,6,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[17].name,2,4,pFile);fwrite(c.vexs[17].introduction,2,7,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[18].name,2,5,pFile);fwrite(c.vexs[18].introduction,2,14,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[19].name,2,4,pFile);fwrite(c.vexs[19].introduction,2,6,pFile); fwrite("\r\n",2,1,pFile);fwrite(c.vexs[20].name,2,8,pFile);fwrite(c.vexs[20].introduction,2,6,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[21].name,2,8,pFile);fwrite(c.vexs[21].introduction,2,6,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[22].name,2,5,pFile);fwrite(c.vexs[22].introduction,2,9,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[23].name,2,12,pFile);fwrite(c.vexs[23].introduction,2,11,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[24].name,2,7,pFile);fwrite(c.vexs[24].introduction,2,6,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[25].name,2,7,pFile);fwrite(c.vexs[25].introduction,2,7,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[26].name,2,4,pFile);fwrite(c.vexs[26].introduction,2,6,pFile);fwrite("\r\n",2,1,pFile);fwrite(c.vexs[27].name,2,4,pFile);fwrite(c.vexs[27].introduction,2,6,pFile);fwrite("\r\n",2,1,pFile);fclose (pFile);return c;}//initgraph// (2) 查找景点在图中的序号int locatevex(mgraph c,int v){int i;for(i=0;i<c.vexnum ;i++)if(v==c.vexs[i].position)return i; //找到,返回顶点序号i return -1; //否则,返回-1}//(3) 、(4) 求两景点间的所有路径// (3) 打印序号为m,n景点间的长度不超过8个景点的路径void path(mgraph c, int m,int n,int k){int s,x=0;int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标if(d[k]==n && k<8) //d[k]存储路径顶点。