#include<iostream>
#define max 100
#define infinity 10000
using namespace std;
void welcome();//开始界面
void menu();//主菜单
void message();//作者信息介绍
void mainplace();//地图地点列表
void map();//校园地图
void introduce();//主要地点简介
void position1();//地点之间的距离
void dijkstra(int v0,int s);//最短路径
void menuchange();//菜单逻辑
void welcome()
{
cout<<" ________________________________"<<endl;
cout<<"| [西南科技大学导航系统] |"<<endl;
cout<<"| |"<<endl;
cout<<"| *欢迎使用西南科技大学导航系统* |"<<endl;
cout<<"|________________________________|"<<endl;
system("pause");
system("cls");
}
void menu()
{
system("cls");
cout<<" ________________________________"<<endl;
cout<<"| [西南科技大学导航系统] |"<<endl;
cout<<"| [系统主菜单] |"<<endl;
cout<<"| 1.校园导航地图 |"<<endl;
cout<<"| 2.校园主要地点 |"<<endl;
cout<<"| 3.主要地点简介 |"<<endl;
cout<<"| 4.进入导航系统 |"<<endl;
cout<<"| 5.退出导航系统 |"<<endl;
cout<<"| 6.查看作者信息 |"<<endl;
cout<<"|________________________________|"<<endl;
}
void menuchange()
{
int n;
while(1)
{
int v0=0,s=0;
menu();
cout<<"请输入您想要进行的操作:";
cin>>n;
switch(n)
{
case 1:
{
system("cls");
map();
cout<<"返回";
system("pause");
}break;
case 2:
{
system("cls");
mainplace();
cout<<"返回";
system("pause");
}break;
case 3:
{
system("cls");
introduce();
cout<<"返回";
system("pause");
}break;
case 4:
{
system("cls");
mainplace();
while(v0<1||v0>10)
{
cout<<"请输入您的起点:";
cin>>v0;
if(v0<1||v0>10)
{
cout<<"输入有误!请重新输入。"<<endl;
}
}
while(s<1||s>10)
{
cout<<"请输入您的终点:";
cin>>s;
if(s<1||s>10)
{
cout<<"输入有误!请重新输入。"<<endl;
}
}
system("cls");
map();
dijkstra(v0,s);
cout<<"返回主菜单";
system("pause");
}break;
case 5:
{
system("cls");
cout<<"感谢您的使用!";
exit(-1);
system("pause");
}break;
case 6:
{
system("cls");
message();
cout<<"返回";
system("pause");
}break;
default:
{
cout<<"输入不符合要求,请重新输入"<<endl;
system("pause");
}
}
}
}
void message()
{
system("cls");
cout<<" ________________________________"<<endl;
cout<<"| [西南科技大学导航系统] |"<<endl;
cout<<"| [作者信息] |"<<endl;
cout<<"| 作者:吴炫逸 |"<<endl;
cout<<"| 学号:5120220210 |"<<endl;
cout<<"| 专业班级:计算机2209 |"<<endl;
cout<<"|________________________________|"<<endl;
}
void mainplace()
{
cout<<" ________________________________________________"<<endl;
cout<<"| [校园主要地点] | "<<endl;
cout<<"| |"<<endl;
cout<<"| (1)西二门 (2)后花园 (3)逸夫图书馆 |"<<endl;
cout<<"| (4)北三宿舍楼 (5)科大苑食堂 (6)校友林 |"<<endl;
cout<<"| (7)中心湖 (8)科技之光广场 (9)新区体育场 |"<<endl;
cout<<"| (10)107广场 |"<<endl;
cout<<"|________________________________________________|"<<endl;
}
void map()
{
cout<<" 西南科技大学 __________________"<<endl;
cout<<" 校园地图: | |_______________________"<<endl;
cout<<" | 。_________________________ |__ "<<endl;
cout<<" ______________________________| |校友林 | |"<<endl;
cout<<"| 西二门 | | |___"<<endl;
cout<<"| 。_________________。____________|__ | |"<<endl;
cout<<"| | | 逸夫图书馆 | | |"<<endl;
cout<<"| | | | | |"<<endl;
cout<<"| | |________________。中心湖 | |"<<endl;
cout<<"| | | | | |"<<endl;
cout<<"| | 北三宿舍楼 | |__ | |"<<endl;
cout<<"| |__________。__________________| | |____________________| |"<<endl;
cout<<"| | | | | |"<<endl;
cout<<"| | |___ | __________。新区体育场 |"<<endl;
cout<<"| | | ____________| | |"<<endl;
cout<<"| |__。后花园 | | | |"<<endl;
cout<<"| | | | 科技之光广场 | |"<<endl;
cout<<"| | | 。__________________ | |"<<endl;
cout<<"| | | | |_____。107广场 |"<<endl;
cout<<"| | | | |"<<endl;
cout<<"| |___________。______| |"<<endl;
cout<<"| 科大苑食堂 __________|"<<endl;
cout<<"|_____________________________________________________________________|"<<endl;
}
void introduce()
{
while(1)
{
system("cls");
cout<<" _____________________________________"<<endl;
cout<<"| (1)中心湖 (2)逸夫图书馆 |"<<endl;
cout<<"| (3)107广场 (4)科技之光广场 |"<<endl;
cout<<"| (5)后花园 (6)校友林 |"<<endl;
cout<<"| |"<<endl;
cout<<"| 输入7 可返回主菜单 |"<<endl;
cout<<"|_____________________________________|"<<endl;
int n;
cout<<"请输入您想要查询的地点编号:";
cin>>n;
switch(n)
{
case 1:
{
system("cls");
cout<<"中心湖:"<<endl;
cout<<"中心湖又名四海湖,面积不小的一个湖,周围环绕着柳树,湖中央一个小岛,更显神秘,情侣最佳浪漫中心。"<<endl;
cout<<"返回地点列表";
system("pause");
}break;
case 2:
{
system("cls");
cout<<"逸夫图书馆:"<<endl;
cout<<"西南科技大学图书馆始建于1952年,至今已有60余年历史。60多年的丰厚沉淀,使图书馆建成了集学习、教学、研究、服务于一体的现代化大学图书馆。"<<endl;
cout<<"返回地点列表";
system("pause");
}break;
case 3:
{
system("cls");
cout<<"107广场:"<<endl;
cout<<"107广场位于西七教学楼中心,常用于组织社团招新活动以及公益互动。"<<endl;
cout<<"返回地点列表";
system("pause");
}break;
case 4:
{
system("cls");
cout<<"科技之光广场:"<<endl;
cout<<"西南科技大学科技之光广场是本校的地标性建筑之一其雕塑上由0和1的计算机语言、钉子以及齿轮组成,象征计算机学院与制造学院的光辉历程。"<<endl;
cout<<"返回地点列表";
system("pause");
}break;
case 5:
{
system("cls");
cout<<"后花园:"<<endl;
cout<<"西南科技大学后花园位于学校后山,花园里有美丽的景色以及环境优雅的餐厅。"<<endl;
cout<<"返回地点列表";
system("pause");
}break;
case 6:
{
system("cls");
cout<<"校友林:"<<endl;
cout<<"校友林位于新区体育场旁边,其中有全国各地校友会的校友石,平日里可以坐在校友林的长椅上修养身心。"<<endl;
cout<<"返回地点列表";
system("pause");
}break;
case 7:
{
system("cls");
menuchange();
system("pause");
}break;
default:
{
cout<<"输入不符合要求,请重新输入"<<endl;
system("pause");
}
}
}
}
int position[max][max];
char name[max][max]={"","西二门","后花园","逸夫图书馆","北三宿舍楼","科大苑食堂","校友林","中心湖","科技之光广场","新区体育场","107广场"};
void position1()
{
int i,j;
for(i=1;i<=10;i++)
{
for(j=1;j<=10;j++)
{
if(i==j)
{
position[i][j]=0;//同一个点之间的距离为 0
}
else position[i][j]=infinity;//初始时两点间的距离都设置成无穷大
}
}
position[1][2]=500;position[1][3]=500;position[1][4]=450;
position[2][5]=300;
position[3][6]=300;position[3][7]=100;
position[4][5]=300;position[4][7]=600;
position[5][8]=700;
position[6][7]=250;position[6][9]=800;
position[7][8]=600;position[7][9]=850;
position[8][10]=550;
position[9][10]=300;
for(i=1;i<=10;i++)
{
for(j=1;j<=10;j++)
{
position[j][i]=position[i][j];//将图变为无向图
}
}
}
void dijkstra(int v0,int s)
{
int i,j,k,v,min;
int path[max],distance[max];//distance:最优路径集合 path:当前节点所连接的之前的节点集
int flag[max],dis[max]; //flag:标记数组 dis:距离长度集合
//初始化
for(i=1;i<=10;i++)//将标记数组全部初始化为 0
{
flag[i]=0;
}
for(i=1;i<=10;i++)
{
dis[i]=position[v0][i];//将距离集合赋值为与出发点连接的边的权值
if(dis[i]<infinity)//当距离小于无穷大,则说明初始点与某节点间有路径
{
path[i]=v0;//将所有结点之前的结点设为 v0
}
}
flag[v0]=1;//此时出发点已经调用完毕,将标记数组中 v0位置的数值由 0变为 1
//求最短路径的步骤 1:每次在未标记的节点中选择与出发点相连的结点,将新找到的结点进行标记以及收录
for(i=1;i<10;i++)
{
min=infinity;
for(j=1;j<=10;j++)
{
if(flag[j]==0&&dis[j]<min)//在尚未成为最优结点的结点集中找距离不是无穷大的
{
min=dis[j];//将无穷大值赋值为两节点间的距离
k=j;//定义一个整形,存放所遍历过得结点
}
}
flag[k]=1;//将已经遍历过得结点的标记数值赋值为 1
/*求最短路径的步骤 2:计算刚加入的结点与不含标记的结点之间的距离,
如果两结点的距离之和小于不含标记的结点的自身距离,则对不含标记的结
点进行距离更新 */
for(v=1;v<=10;v++)
{
if(flag[v]==0&&dis[v]>dis[k]+position[k][v])
{
path[v]=k;
dis[v]=dis[k]+position[k][v];
}
}
}
v=s;
i=1;
while(path[v]!=v0)
{
distance[i++]=path[v];
v=path[v];
}
k=i-1;//寻找前一个点
cout<<"最短路线为:";
cout<<name[v0]<<"-->";//初始位置的名称
for(i=k;i>=1;i--)
{
cout<<name[distance[i]]<<"-->";//结点名称从后到前依次输出
}
cout<<name[s]<<endl;//最后输出目的地名称
cout<<"全程"<<dis[s]<<"米"<<endl;
}
int main()
{
position1();
welcome();
menu();
menuchange();
}