校园导游咨询(图的应用)
[问题描述]
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息;
(2)提供基本信息的修改功能;
(3)为来访客人提供图中任意景点相关信息的查询;
(4)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。
设计思路
构建结构体
typedef struct{ //景点相关信息
char name[M];//景点名称
char number[M];//景点代号
char Introduction[M];//景点简介
}Datatype;
typedef struct{
int num; //景点编号
Datatype data;//景点信息
}View;
typedef struct {
View view[MAXNum];//存放顶点的一堆数组,在0位单元没有
int pathlen[MAXNum][MAXNum];//存放路径的长度
int m,n;
}MGraph;
MGraph MGr;//全局变量,定义MGr为MGraph类型
int pathlen[MAXNum][MAXNum];//存储路径
int shortest[MAXNum][MAXNum];//定义最小路径
创建函数方法
void Init();//构建景点信息
void ChangeMapMes();/*修改景点信息*/
void Map();//景点地图
void ViewMes()/*查看景点信息*/
void Floyd()//弗洛伊德算法
void PrintPath(){/打印路径
void Shortest()//最短路径
void Menu()//界面菜单
int main()//主函数
采用Floyd算法求景点之间的路径
void Floyd(){//弗洛伊德算法
int i,j,k;
for( i=1;i<=12;i++){
for( j=1;j<=12;j++){//初始化数组
shortest[i][j]=MGr.pathlen[i][j];
if (shortest[i][j]<M&&i!=j) pathlen[i][j]=i;
else pathlen[i][j]=0;
}
}
for( k=1;k<=12;k++){
for( i=1;i<=12;i++){
for( j=1;j<=12;j++){
if((shortest[i][k]+shortest[k][j])<shortest[i][j]){//存在更短的路径
shortest[i][j]=shortest[i][k]+shortest[k][j]; //更新值
pathlen[i][j]=pathlen[k][j];//记录经过的路径
}
}
}
}
}
源代码(如下)
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#define MAXNum 50 //景点最大个数
#define Max 65434 //最大无穷值
const int M=1000;
typedef struct{ //景点相关信息
char name[M];//景点名称
char number[M];//景点代号
char Introduction[M];//景点简介
}Datatype;
typedef struct{
int num; //景点编号
Datatype data;//景点信息
}View;
typedef struct {
View view[MAXNum];//存放顶点的一堆数组,在0位单元没有
int pathlen[MAXNum][MAXNum];//存放路径的长度
int m,n;
}MGraph;
MGraph MGr;//全局变量,定义MGr为MGraph类型
int pathlen[MAXNum][MAXNum];//存储路径
int shortest[MAXNum][MAXNum];//定义最小路径
void Init(){//构建景点信息
int count=1,k=1,i,j;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS001");
strcpy(MGr.view[count].data.name,"国际教育学院教学楼");
strcpy(MGr.view[count].data.Introduction,"这里的人说好超好听,我超喜欢在里面呢!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS002");
strcpy(MGr.view[count].data.name,"北苑篮球场");
strcpy(MGr.view[count].data.Introduction,"学生打球的地方,也是上体育课的重要圣地!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS003");
strcpy(MGr.view[count].data.name,"北苑餐厅");
strcpy(MGr.view[count].data.Introduction,"美食的集结地!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS004");
strcpy(MGr.view[count].data.name,"健身房");
strcpy(MGr.view[count].data.Introduction,"集结于锻炼艰苦意志力大学生圣地!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS005");
strcpy(MGr.view[count].data.name,"体育馆");
strcpy(MGr.view[count].data.Introduction,"这里有各种运动的场地!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS006");
strcpy(MGr.view[count].data.name,"北苑操场");
strcpy(MGr.view[count].data.Introduction,"一些大型活动的举办地点!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS007");
strcpy(MGr.view[count].data.name,"图书馆");
strcpy(MGr.view[count].data.Introduction,"提供各种各样的书,适于阅读,学习!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS008");
strcpy(MGr.view[count].data.name,"教学楼区");
strcpy(MGr.view[count].data.Introduction,"学习的重要领地区域,坚不可摧!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS009");
strcpy(MGr.view[count].data.name,"南苑餐厅");
strcpy(MGr.view[count].data.Introduction,"美食的集结地!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS010");
strcpy(MGr.view[count].data.name,"南苑操场");
strcpy(MGr.view[count].data.Introduction,"乐于运动的人的眼中好地方!");
count++,k++;
MGr.view[count].num=k;
strcpy(MGr.view[count].data.number,"TS011");
strcpy(MGr.view[count].data.name,"工业训练中心");
strcpy(MGr.view[count].data.Introduction,"各专业工地实习地点!");
count++,k++;
for(i=1;i<=k;i++){
for(j=1;j<=k;j++){
if(i==j){
MGr.pathlen[i][j]=0;
pathlen[i][j]=0;
}else{
MGr.pathlen[i][j]=Max;
pathlen[i][j]=Max;
}
}
}//下方为景点之间的路程,根据个人需要可以更改
MGr.pathlen[1][2]=MGr.pathlen[2][1]=100;
MGr.pathlen[2][3]=MGr.pathlen[3][2]=100;
MGr.pathlen[2][4]=MGr.pathlen[4][2]=50;
MGr.pathlen[1][4]=MGr.pathlen[4][1]=100;
MGr.pathlen[3][1]=MGr.pathlen[1][3]=100;
MGr.pathlen[5][6]=MGr.pathlen[6][5]=100;
MGr.pathlen[6][7]=MGr.pathlen[7][6]=200;
MGr.pathlen[7][8]=MGr.pathlen[8][7]=300;
MGr.pathlen[8][9]=MGr.pathlen[9][8]=200;
MGr.pathlen[9][10]=MGr.pathlen[10][9]=250;
MGr.pathlen[10][11]=MGr.pathlen[11][10]=50;
}
void ChangeMapMes(){//修改景点信息
cout <<">>请输入您要修改的景点的编号:";
int i=0,k=1;
cin>>i;
cout <<"1.景点名称\n";
cout <<"2.景点代号\n";
cout <<"3.景点简介\n";
cout <<">>请选择您要修改的景点信息:"<<endl;
while(k)
{int chose;
cin>>chose;
switch(chose){
case 1: cout <<"请输入修改成的景点名称:";cin>>MGr.view[i].data.name;k=0;break;
case 2: cout <<"请输入修改成的景点代号:";cin>>MGr.view[i].data.number;k=0;break;
case 3: cout <<"请输入修改成的景点简介:";cin>>MGr.view[i].data.Introduction;k=0; break;
default:cout <<"输入错误,请输入正确的选择.";break;
}
}
cout <<"修改成功,修改后的景点信息为:\n";
cout <<"景点代号:"<<MGr.view[i].data.number<<endl;
cout <<"景点名称:"<<MGr.view[i].data.name<<endl;
cout <<"景点简介:"<<MGr.view[i].data.Introduction<<endl;
}
void Map()//景点地图,此图为我校地图,也可以更改
{
cout << endl;
cout << " ★---------★---------★---------★---------★---------★-------★" << endl;
cout << " 【1】国际教育学院教学楼" << endl;
cout << " ☆ | ☆" << endl;
cout << " 【2】北苑篮球场<-----------|------------->【3】北苑餐厅 " << endl;
cout << " 【4】健身房<------- | " << endl;
cout << " ☆ | ☆" << endl;
cout << " | " << endl;
cout << " ☆ 【5】体育馆 <------ |---->【6】北苑操场 ☆" << endl;
cout << " | " << endl;
cout << " ☆ | ☆" << endl;
cout << " 【7】图书馆 " << endl;
cout << " ☆ | ☆" << endl;
cout << " | " << endl;
cout << " ☆ 北 | ☆" << endl;
cout << " | 【8】教学楼区<---|---->【9】南苑餐厅 " << endl;
cout << " ☆ | | ☆" << endl;
cout << " | |-------------->【10】南苑操场 " << endl;
cout << " ☆ 南 | ☆" << endl;
cout << " 【11】工业实训基地 " << endl;
cout << " ★---------★---------★---------★---------★---------★-------★" << endl;
}
/*查看景点信息*/
void ViewMes(){
cout<<"请输入您要查看的景点信息的编号:";
int i;
cin>>i;
cout<<"编号为"<<i<<"的景点的信息为:\n";
cout<<"---------------------------------------------\n";
cout<<"景点代号:"<<MGr.view[i].data.number<<endl;
cout<<"景点名称:"<<MGr.view[i].data.name<<endl;
cout<<"景点简介:"<<MGr.view[i].data.Introduction<<endl;
cout<<"---------------------------------------------"<<endl;
}
void Floyd(){//弗洛伊德算法
int i,j,k;
for( i=1;i<=12;i++){
for( j=1;j<=12;j++){//初始化数组
shortest[i][j]=MGr.pathlen[i][j];
if (shortest[i][j]<M&&i!=j) pathlen[i][j]=i;
else pathlen[i][j]=0;
}
}
for( k=1;k<=12;k++){
for( i=1;i<=12;i++){
for( j=1;j<=12;j++){
if((shortest[i][k]+shortest[k][j])<shortest[i][j]){//存在更短的路径
shortest[i][j]=shortest[i][k]+shortest[k][j]; //更新值
pathlen[i][j]=pathlen[k][j];//记录经过的路径
}
}
}
}
}
void PrintPath(int i,int j){//打印路径
int next=i;
cout<<">>路径为:\n";
while(next!=j){
cout<<MGr.view[next].data.name;
next=pathlen[next][j];//当前的后继点的编号
}
cout<<MGr.view[j].data.name<<endl;
}
void Shortest(){//最短路径
Floyd();//预处理所有的最短路径
cout<<"对照校园平面图,输入您当前所在景点位置及要去的景点的编号:";
int s,e;
cin>>s>>e;
if(s<=12&&s>=0&&e<=12&&e>=0){
cout<<MGr.view[s].data.name<<"到"<<MGr.view[e].data.name<<"的最短路径长度为:"<<shortest[s][e]<<endl;
//PrintPath(s,e);
}else{
cout<<"编号输入错误,请重新输入正确的景点编号!\n";
Shortest();
}
}
void Menu(){
cout<<"----------------欢迎进入校园导航系统----------------\n";
cout<<"\n----------------------------------------------------\n";
cout<<"1.查看校园平面图\n";
cout<<"2.修改景点信息\n";
cout<<"3.查看景点信息\n";
cout<<"4.最短路径查询\n";
cout<<"5.退出\n";
cout<<"----------------------------------------------------"<<endl;
cout<<"请输入您要选择的功能:"<<endl;
}
int main()
{
Init();
cout<<"景点信息初始化成功,进入主界面"<<endl;
int p=1;
while(p){
int c;
Menu();
cin>>c;
switch(c)
{
case 1: Map();system("pause");break;
case 2: ChangeMapMes();system("pause");break;
case 3: ViewMes();system("pause");break;
case 4: Shortest();system("pause");break;
case 5: p=0;system("pause");break;
default :cout<<"您的选择有误,请重新选择!"<<endl; break;
}
system("cls");
}
return 0;
}