校园导游咨询(图的应用)
[问题描述]
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息;
(2)提供基本信息的修改功能;
(3)为来访客人提供图中任意景点相关信息的查询;
(4)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。
分析:Floyd算法求最短路径,并保存路径。
源码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<cstring>
#include<stack>
#include<queue>
#include<algorithm>
#include<math.h>
#include<vector>
#include<iomanip>
#include<map>
using namespace std;
#define MX 9999999
const int N = 11;
int path[N][N], d[N];
struct node
{
int daihao;
string name;
string jianjie;
}s1,s2;
node add[N]=
{
{ 1, "国际教育学院教学楼", "此栋教学楼为中工国际教育学院专属教学楼,与国外合作办学。同时内设考研自习室,提供了良好的学习氛围。" },
{ 2, "北苑篮球场", "它是北苑学生休闲活动的场所之一,除篮球场外还设有排球与网球场地,但因其地势低洼,故又被称做“北大坑”。" },
{ 3, "北苑餐厅", "北苑餐厅共设有三层,提供了来自全国各地的美食,价格设置合理,饭菜管饱,满足了广大师生的需求。" },
{ 4, "大学生活动中心", "活动中心共有五层,内设有乒乓球,篮球,羽毛球等场地,方便休闲,同时也是重大典礼举办的场所,能够容纳数万人,雄伟壮观。" },
{ 5, "中心操场", "中心操场设有塑胶跑道与露天网球场,常有同学来此晨练,此外校庆汇演等重大活动也在此开展,有着“中心操场”的美誉。" },
{ 6, "图书馆", "图书馆收纳了各个专业的相关书籍,是名副其实的“书的海洋”,提供了丰富的学习资源,也是中工最宏伟的建筑,没有之一。" },
{ 7, "紫薇广场", "紫薇广场是社团活动与招聘会的举办点,每当节日,紫薇广场上必定热闹非凡,是各大社团的活动场所。" },
{ 8, "教学楼群", "它聚集了8,9,10,11号教学楼,是各大学院的办公场所所在地,同时也是各个实验室的汇聚之地,学术氛围浓厚。" },
{ 9, "南苑操场", "南苑操场供生活在南苑的学子们活动的场所,同时设有锻炼器材与篮球场,极大地方便了同学们的生活。" },
{ 10,"南苑餐厅","南苑餐厅共设三层,环境优美,食物可口,满足广大师生,而且价格合理。"},
{ 11, "工业实训基地", "基地位于中工的最南面,提供各大机床以便学生实训,是学生们实践实训的绝佳场所。" }
};
int w[N][N] =
{
{ 0, 10, 10, 40, 40, MX, MX, MX, MX, MX ,MX},
{ 10, 0, 15, 30, MX, MX, MX, MX, MX, MX ,MX},
{ 10, 15, 0, MX, 30, MX, MX, MX, MX, MX ,MX},
{ 40, 30, MX, 0, 2, MX, MX, MX, MX, MX ,MX},
{ 40, MX, 30, 2, 0, 20, MX, MX, MX, MX ,MX},
{ MX, MX, MX, MX, 20, 0, 25, 30, MX, MX ,MX},
{ MX, MX, MX, MX, MX, 25, 0, 20, MX, MX ,MX},
{ MX, MX, MX, MX, MX, 30, 20, 0, 15, 30 ,40},
{ MX, MX, MX, MX, MX, MX, MX, 15, 0, 20 ,20},
{ MX, MX, MX, MX, MX, MX, MX, 30, 20, 0, 15},
{ MX, MX, MX, MX, MX, MX, MX, 40, 20, 15, 0}
};
void Floyd()
{//Floyd算法核心代码
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
path[i][j]=j;
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if(w[i][j]>w[i][k]+w[k][j])
{
w[i][j]=w[i][k]+w[k][j];
path[i][j]=path[i][k];
}
}
void Path(int st,int ed)
{
int x=st;
cout<<"路径: "<<add[x].name;
while(x!=ed)
{
cout<<"-->"<<add[path[x][ed]].name;
x=path[x][ed];
}
cout<<endl;
}
void ShortPath()
{
int st,ed;
cout<<"请输入起点和目的地(1~11空格隔开):"<<endl;
cin>>st>>ed;
if(st>=1&&st<=11&&ed>=1&&ed<=11)
{
cout<<" 从 "<<add[st-1].name<<" 到 "<<add[ed-1].name<<" :"<<endl;
Floyd();
Path(st-1,ed-1);
cout<<"路径长度:"<<w[st-1][ed-1]*10<<" 米。"<<endl<<endl;
}
else
{
cout<<"输入的地方不存在!"<<endl;
}
}
void find()
{
int n_id;
cout<<"请输入要查询景点的代号"<<endl;
cin>>n_id;
if(n_id>=1&&n_id<=11)
{
cout<<"代号:【"<<add[n_id-1].daihao<<"】"<<endl
<<"名称:"<<add[n_id-1].name<<endl
<<"简介:"<<add[n_id-1].jianjie<<endl
<<"查询成功!=^_^="<<endl;
}
else
{
cout<<"输入有误!!!"<<endl;
}
}
void xiugai()
{
string mi;
int st,ed,len;
cout<<"请输入管理员密码";
cin>>mi;
if(mi=="123456")
{
cout<<"请输入要修改路径地点所连接地点编号(1~11空格隔开):";
cin>>st>>ed;
cout<<"请输入路径长度";cin>>len;
w[st-1][ed-1]=w[ed-1][st-1]=len;
}
else
{
cout<<"Sorry,密码错误!^_^"<<endl;
}
}
void exit()
{
cout<<endl;
cout<<" ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<endl;
cout<<" ◇ 感谢使用=^_^= ◇"<<endl;
cout<<endl;
cout<<" ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<endl;
}
void mp()
{
cout << endl;
cout << " ★---------★---------★---------★---------★---------★---------★" << endl;
cout << " 【1】国际教育学院教学楼 "<< endl;
cout << " ☆ | ☆" << endl;
cout << " 【2】北苑篮球场<-----------|-------------------->【3】北苑餐厅 " << endl;
cout << " ☆ | ☆" << endl;
cout << " | " << endl;
cout << " ☆【4】大学生活动中心<-----【5】中心操场 ☆" << endl;
cout << " | " << endl;
cout << " ☆ 北 | ☆" << endl;
cout << " | 【6】图书馆 " << endl;
cout << " ☆ 西---|---东 | ☆" << endl;
cout << " | |-------------------->【7】紫薇广场 " << endl;
cout << " ☆ 南 | ☆" << endl;
cout << " 【8】教学楼群 " << endl;
cout << " ☆ | ☆" << endl;
cout << " 【9】南苑操场<-------------|-------------------【10】南苑餐厅 " << endl;
cout << " ☆ | ☆" << endl;
cout << " 【11】工业实训基地 " << endl;
cout << " ★---------★---------★---------★---------★---------★---------★" << endl;
cout<<endl;
}
void menu()
{
cout<<endl;
cout<<" ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<" 校园导游系统 "<<endl;
cout<<" ◇ ◇"<<endl;
cout<<" 1、中工导游图 "<<endl;
cout<<" ◇ 2、景点信息查询(客人) ◇"<<endl;
cout<<" 3、景点路径查询(客人) "<<endl;
cout<<" ◇ 4、导游图信息修改(管理员) ◇"<<endl;
cout<<" 5、退出系统 "<<endl;
cout<<" ◇ ◇"<<endl;
cout<<" 中工师生欢迎你 "<<endl;
cout<<" ◆-------◆---------◆---------◆-------◆"<<endl;
cout<<endl<<endl<<"请选择功能:";
}
int main()
{
system("color 37");
int n;
while(1)
{
system("cls");
menu();
cin>>n;
if(n==1)
{
system("cls");
mp();
system("pause");
}
else if(n==2)
{
system("cls");
mp();
find();
system("pause");
}
else if(n==3)
{
system("cls");
mp();
ShortPath();
system("pause");
}
else if(n==4)
{
system("cls");
mp();
xiugai();
system("pause");
}
else if(n==5)
{
system("cls");
exit();
break;
}
else
{
cout<<"输入有误,请重新输入!"<<endl;
system("pause");
continue;
}
}
return 0;
}