校园导游咨询(图的应用)
[问题描述]
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息;
(2)提供基本信息的修改功能;
(3)为来访客人提供图中任意景点相关信息的查询;
(4)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。
[设计思路]
- 结构使用邻接表
- 最短路使用迪杰斯特拉算法
- 前驱数组存放具体路径
[代码及注释]
#include<iostream>
#include<string>
#include<vector>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f /*无穷大*/
#define MAXSIZE 11 /*最大景点数*/
int flag; /*判断程序是否退出*/
//结构
typedef struct{
int num; /*景点编号*/
string name; /*景点名称*/
string information; /*景点简介*/
string others; /*景点备注*/
}area; /*结点*/
int dis[MAXSIZE],vis[MAXSIZE],pre[MAXSIZE]; /*dis:最短路径,vis:标记,pre:前驱*/
typedef struct{
int to; /*目的景点*/
int len; /*路线长度*/
}Edge;
vector <Edge> Graph[MAXSIZE]; /*邻接表储存*/
//子函数
void Creat(); /*建立邻接表*/
void Show(); /*打印平面图*/
void QueryArea(); /*查询景点信息*/
void Resive(); /*修改*/
void QueryRoad(); /*寻找最短路*/
void menu(); /*操作汇总*/
//具体
area Area[MAXSIZE]={
{0,"---","----------"},
{1,"国教楼","国外合作办学,学习氛围良好"},
{2,"北苑餐厅","食物营养美味,种类多"},
{3,"体育馆","器材丰富,锻炼身体"},
{4,"北苑操场","场地广阔,适合运动"},
{5,"行政楼","行政工作场地"},
{6,"图书馆","最棒的一座楼,适合学习"},
{7,"三号组团楼","多个学院办公汇集地"},
{8,"四号楼","一楼自由机房"},
{9,"南苑餐厅","便宜健康"},
{10,"南苑操场","供生活在南苑的学子们活动的场所"}
}; /*初始化各景点信息,初始没有备注*/
void Creat()
{
Graph[1].push_back(Edge{2,500});
Graph[2].push_back(Edge{1,500});
Graph[2].push_back(Edge{3,1000});
Graph[3].push_back(Edge{2,1000});
Graph[2].push_back(Edge{4,900});
Graph[4].push_back(Edge{2,900});
Graph[3].push_back(Edge{5,600});
Graph[5].push_back(Edge{3,600});
Graph[3].push_back(Edge{4,50});
Graph[4].push_back(Edge{3,50});
Graph[4].push_back(Edge{6,1200});
Graph[6].push_back(Edge{4,1200});
Graph[5].push_back(Edge{6,150});
Graph[6].push_back(Edge{5,150});
Graph[6].push_back(Edge{8,750});
Graph[8].push_back(Edge{6,750});
Graph[4].push_back(Edge{7,1500});
Graph[7].push_back(Edge{4,1500});
Graph[6].push_back(Edge{7,600});
Graph[7].push_back(Edge{6,600});
Graph[7].push_back(Edge{9,1200});
Graph[9].push_back(Edge{7,1200});
Graph[8].push_back(Edge{9,500});
Graph[9].push_back(Edge{8,500});
Graph[8].push_back(Edge{10,1200});
Graph[10].push_back(Edge{8,1200});
Graph[9].push_back(Edge{10,900});
Graph[10].push_back(Edge{9,900});
} /*邻接表的初始化*/
void Show()
{
cout<<" ------------------------------------------------------"<<endl;
cout<<" | 中工平面图 |"<<endl;
cout<<" ------------------------------------------------------"<<endl;
cout<<" | 北门 |"<<endl;
cout<<" | || |"<<endl;
cout<<" | [1]国教楼 |"<<endl;
cout<<" | || |"<<endl;
cout<<" | || 500m |"<<endl;
cout<<" | || |"<<endl;
cout<<" | [2]北苑餐厅 |"<<endl;
cout<<" | || |"<<endl;
cout<<" | || |"<<endl;
cout<<" | 1000m|| |"<<endl;
cout<<" | || 900m |"<<endl;
cout<<" | // || |"<<endl;
cout<<" | // || |"<<endl;
cout<<" | [3]体育馆-50m-[4]北苑操场---|| |"<<endl;
cout<<" | || || || |"<<endl;
cout<<" | 600m|| || || 1500m |"<<endl;
cout<<" | || || 1200m || |"<<endl;
cout<<" | [5]行政楼 || || |"<<endl;
cout<<" | ||[6]图书馆 [7]三号组团楼 |"<<endl;
cout<<" | //150m|| || |"<<endl;
cout<<" |西门--------------------|| || 1200m |"<<endl;
cout<<" | || 750m || |"<<endl;
cout<<" | || ||--------东门 |"<<endl;
cout<<" | // 500m || |"<<endl;
cout<<" | [8]四号楼-------[9]南苑餐厅 |"<<endl;
cout<<" | || || |"<<endl;
cout<<" | || || |"<<endl;
cout<<" | || // |"<<endl;
cout<<" | || 1200m -- 900m |"<<endl;
cout<<" | ||-----[10]南苑操场 |"<<endl;
cout<<" | || |"<<endl;
cout<<" | 南门 |"<<endl;
cout<<" | |"<<endl;
cout<<" ------------------------------------------------------"<<endl;
}
void QueryArea()
{
Show();
cout<<"输入要查询的景点编号(1~10):";
int n;
cin>>n;
if(n<1||n>10)
{
cout<<"输入的编号不合法!"<<endl;
return;
}
cout<<"------------------------------------------------------"<<endl;
cout<<"<<<<编号为"<<n<<"的景点"<<endl;
cout<<"|名称: "<<Area[n].name<<endl;
cout<<"|简介:"<<Area[n].information<<endl;
cout<<"|备注:"<<Area[n].others<<endl;
cout<<"------------------------------------------------------"<<endl;
}
void Resive()
{
Show();
cout<<"输入要修改的景点编号:";
int n;
cin>>n;
if(n<1||n>10)
{
cout<<"输入的编号不合法!"<<endl;
return;
}
cout<<" ------------------------"<<endl;
cout<<" | 景点修改系统 |"<<endl;
cout<<" |------------------------|"<<endl;
cout<<" | 1--景点简介 |"<<endl;
cout<<" | 2--修改备注 |"<<endl;
cout<<" | 其他--无变化 |"<<endl;
cout<<" ------------------------"<<endl;
int op;
cout<<"输入你的选择:";
cin>>op;
switch(op)
{
case 1:{
string Information;
cout<<"输入即将修改的内容:";
cin>>Information;
Area[n].information=Information;
cout<<"<<<<修改成功"<<endl;
}
break;
case 2:{
string Others;
cout<<"输入要修改的备注:";
cin>>Others;
Area[n].others=Others;
cout<<"<<<<修改成功"<<endl;
}
break;
default :cout<<"<<<<没有任何改动!"<<endl;
}
cout<<"------------------------------"<<endl;
}
void QueryRoad()
{
Show();
Creat();
cout<<"输入起始点编号与目的地编号,空格隔开:";
int s,e;
cin>>s>>e;
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
dis[s]=0; /*自身到自身距离置为0*/
int k=MAXSIZE-1; /*MAXSIZE-1次查找*/
while(k--)
{
int MAX=inf,from;
for(int i=1;i<MAXSIZE;++i)
if(!vis[i]&&dis[i]<MAX)
{
MAX=dis[i];
from=i;
}
vis[from]=1;
for(int i=0;i<Graph[from].size();++i)
{
int to=Graph[from][i].to;
int len=Graph[from][i].len;
if(!vis[to]&&dis[to]>dis[from]+len)
{
dis[to]=dis[from]+len;
pre[to]=from; /*记录前驱*/
}
}
}
cout<<Area[s].name<<"到"<<Area[e].name<<"的最短距离为"<<dis[e]<<"米"<<endl;
cout<<"<<<<具体路径为:"<<endl;
int temp[MAXSIZE];
k=1;
temp[1]=e;
while(pre[e])
{
temp[++k]=pre[e];
e=pre[e];
}
cout<<Area[temp[k]].name;
for(int i=k-1;i>=1;--i)
cout<<"->"<<Area[temp[i]].name;
/*打印具体路径*/
cout<<endl;
cout<<"-----------------------------------"<<endl;
}
void menu()
{
cout<<" ------------------------"<<endl;
cout<<" | 欢迎来到中工导游系统 |"<<endl;
cout<<" |------------------------|"<<endl;
cout<<" | 1--查看平面图 |"<<endl;
cout<<" | 2--修改景点信息 |"<<endl;
cout<<" | 3--查看景点信息 |"<<endl;
cout<<" | 4--查询最短路径 |"<<endl;
cout<<" | 其他--退出 |"<<endl;
cout<<" ------------------------"<<endl;
int op;
cout<<"输入你的选择:";
cin>>op;
switch(op)
{
case 1:Show();break;
case 2:Resive();break;
case 3:QueryArea();break;
case 4:QueryRoad();break;
default :flag=1;cout<<"<<<<欢迎下次再来!"<<endl;
}
}
int main()
{
while(1)
{
menu();
if(flag)break;
system("pause");
system("cls");
}
return 0;
}
[简单展示]