本课题致力于解决外来宾客或者新生对于校园环境了解的诉求以及校园内游览的路线规划诉求,课题实现的校园导航系统能够帮助获取校园内主要景点的信息,获取景点间最短距离,获取多个景点的最短路径规划,获取不同出行方式下的路径时间,提高校园内的出行效率。
这是1.0版本只能进行两点间的距离计算
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<iomanip>
#define Infinify 65536 //定义无穷大
using namespace std;
int sum=30; //全局变量记录景点总数
int map[100][100]; //建立map二维数组存放带边权邻接矩阵,存储景点间距离
int Point[100][100]; //记录对应点的最小路径的前驱点
int minPath[100][100]; //记录顶点间的最小路径值
//定义结构体 Attraction
struct Attraction{
string name; //景点名称
string des; //景点简介
}p[50];
//将南京理工大学的地图通过带边权邻接矩阵抽象出来
void Load_Map(){ //存入景点名称与简介
//初始化map数组
int i,j;
for(i=1;i<=99;i++){
for(j=1;j<=99;j++){
if(i==j) map[i][j]=0;
else map[i][j]=Infinify;
}
}
//存入景点信息
p[1].name="一号门"; p[1].des="门外就是罗汉巷,好吃多多!";
p[2].name="二号门";p[2].des="也就是北大门,只有它允许外来车辆进出哦!";
p[3].name="三号门(顺丰快递点)";p[3].des="往西一点就是下马坊地铁站,十分方便!";
p[4].name="四号门";p[4].des="外卖柜非常实用!";
p[5].name="五号门";p[5].des="最没有存在感的一个门!";
p[6].name="南大门";p[6].des="非常气派,记得合影留念哦!";
p[7].name="七号门";p[7].des="自从有了外卖柜,妈妈再也不用担心我的外卖被偷啦!";
p[8].name="竹园小区快递点";p[8].des="收京东、天猫快递!";
p[9].name="校医院";p[9].des="好宝宝要注意自己的身体健康哦!";
p[10].name="体育中心";p[10].des="非常大!";
p[11].name="风味美食广场";p[11].des="一楼地方美食一般!二楼的自选餐非常一般!";
p[12].name="第二运动场";p[12].des="体育场的草是真草!";
p[13].name="冶园";p[13].des="这是一处融合自然与人文景观的校园美景!";
p[14].name="和平园(水杉林)";p[14].des="二月兰非常漂亮!要找准时间观赏哦!";
p[15].name="时间广场";p[15].des="有个大日晷!傍晚有很多小朋友哦!";
p[16].name="紫霞湖(艺文馆)";p[16].des="不管是早晨还是傍晚,湖面中都可以看到朝霞与晚霞的倒影!";
p[17].name="学术交流中心";p[17].des="可以听学术讲座,还有话剧可以看哦!";
p[18].name="二道门";p[18].des="经典打卡SPOT!";
p[19].name="二工";p[19].des="有点旧旧的教学楼!";
p[20].name="一工";p[20].des="有点老老的教学楼!";
p[21].name="三工";p[21].des="年纪轻轻就看着一把年纪!";
p[22].name="阳光体育长廊";p[22].des="听说有个很贵的场子哦!";
p[23].name="致远楼";p[23].des="里面都是大拿!";
p[24].name="银杏广场";p[24].des="下雪天打雪仗非常好玩!";
p[25].name="图书馆";p[25].des="有着非常丰富的资源哦!";
p[26].name="逸夫楼";p[26].des="构造非常奇怪!";
p[27].name="四工";p[27].des="大!新!网好!记得早点去抢座!";
p[28].name="明苑美食广场";p[28].des="二楼的麻椒鸡和脆骨肠炒饭非常推荐!";
p[29].name="紫麓宾馆";p[29].des="欢迎光临!";
p[30].name="自动化学院";p[30].des="气派的大楼!";
//存入景点间(步行)距离至map
map[1][2]=655;map[1][29]=331;map[1][15]=456;
map[2][1]=655;map[2][3]=405;map[2][13]=484;map[2][14]=484;map[2][15]=422;
map[3][8]=375;map[3][13]=641;map[3][2]=405;
map[4][12]=405;map[4][6]=380;map[4][28]=209;
map[5][6]=271;map[5][21]=272;map[5][20]=345;map[5][29]=972;map[5][30]=439;
map[6][4]=380;map[6][5]=271;map[6][28]=267;map[6][27]=151;map[6][26]=104;
map[7][10]=153;map[7][11]=357;map[7][18]=345;map[7][12]=304;
map[8][3]=375;map[8][9]=114;
map[9][8]=114;map[9][10]=192;
map[10][9]=192;map[10][16]=259;map[10][7]=153;
map[11][7]=357;map[11][12]=10;map[11][22]=395;
map[12][7]=304;map[12][11]=10;map[12][4]=405;
map[13][3]=641;map[13][2]=484;map[13][14]=186;map[13][16]=175;
map[14][2]=484;map[14][13]=186;map[14][17]=337;
map[15][1]=456;map[15][17]=117;map[15][29]=155;map[15][2]=422;
map[16][10]=259;map[16][13]=175;map[16][17]=162;map[16][18]=228;
map[17][14]=337;map[17][15]=117;map[17][29]=125;map[17][16]=162;map[17][18]=93;
map[18][7]=345;map[18][16]=228;map[18][17]=93;map[18][19]=141;map[18][23]=199;
map[19][18]=141;map[19][23]=60;map[19][20]=338;
map[20][19]=338;map[20][21]=158;map[20][5]=345;map[20][30]=591;
map[21][25]=248;map[21][20]=158;map[21][5]=272;
map[22][23]=179;map[22][24]=100;map[22][27]=332;map[22][11]=395;
map[23][18]=199;map[23][19]=60;map[23][24]=126;map[23][22]=179;
map[24][23]=126;map[24][22]=100;map[24][25]=134;
map[25][21]=248;map[25][24]=134;map[25][26]=131;
map[26][25]=131;map[26][27]=20;map[26][6]=104;
map[27][22]=332;map[27][28]=211;map[27][6]=151;map[27][26]=20;
map[28][4]=209;map[28][27]=211;map[28][6]=267;
map[29][1]=331;map[29][15]=155;map[29][17]=125;map[29][5]=972;
map[30][20]=591;map[30][5]=439;
return;
}
//输出邻接矩阵
void Print_Matrix(){
int i,j;
for(i=1;i<=sum;i++){
for(j=1;j<=sum;j++){
if(map[i][j]==Infinify) map[i][j]=-1;
cout<<setw(3)<<map[i][j]<<" ";
if(j==sum) cout<<endl;
}
}
return;
}
//景点编号及名称指引界面
void Load_List(){
system("cls");
cout<<" ************************************************************************* "<<endl;
cout<<" ** 欢迎来到南京理工大学! ** "<<endl;
cout<<" ** 以下为景点编号及名称 ** "<<endl;
cout<<" ************************************************************************* "<<endl;
cout<<" ** (1)一号门 (2)二号门 (3)三号门 ** "<<endl;
cout<<" ** (4)四号门 (5)五号门 (6)南大门 ** "<<endl;
cout<<" ** (7)七号门 (8)竹园小区快递点 (9)校医院 ** "<<endl;
cout<<" ** (10)体育中心 (11)风味美食广场 (12)第二运动场 ** "<<endl;
cout<<" ** (13)冶园 (14)和平园(水杉林)(15)时间广场 ** "<<endl;
cout<<" ** (16)紫霞湖(艺文馆) (17)学术交流中心 (18)二道门 ** "<<endl;
cout<<" ** (19)二工 (20)一工 (21)三工 ** "<<endl;
cout<<" ** (22)阳光体育长廊 (23)致远楼 (24)银杏广场 ** "<<endl;
cout<<" ** (25)图书馆 (26)逸夫楼 (27)四工 ** "<<endl;
cout<<" ** (28)明苑美食广场 (29)紫麓宾馆 (30)自动化院 ** "<<endl;
cout<<" ************************************************************************* "<<endl;
return;
}
int *path;
int *dist;
int numPoints = 0;
//返回当前顶点数
int NumberOfPoints()
{
return numPoints;
};
// 给出顶点代码code在图中位置
int getPointPos (char code)
{
{return code;}
return -1;
};
//查询两景点之间的最短路径和距离
void MinPath(int v)
{
int n=NumberOfPoints();
dist=new int[n];
path=new int[n];
bool * S=new bool[n]; //顶点集合,如果s[i]等于true 说明i点已经被加入最短路径集合中
int i,j,k,w,min;
for(i=0;i<n;i++)
{
dist[i]=map[i][v]; //数组初始化
S[i]=false;
if(i!=v&&dist[i]<Infinify)
path[i]=v;//说明i到v有边相连 ,设置path[i]=v
else
path[i]=-1;//说明i到v无边相连
}
S[v]=true; //顶点v加入顶点集合
dist[v]=0;//自己到自己的最短路径为0
for(i=0;i<n-1;i++)
{
min=Infinify;
int u=v; //选不在S中具有最短路径的顶点u
for(j=0;j<n;j++)
if(S[j]==false&&dist[j]<min)
{
u=j;
min=dist[j];
}
S[u]=true; //顶点u加入集合S
for(k=0;k<n;k++)
{
w=map[u][k];
if(S[k]==false&&w<=Infinify&&dist[u]+w<dist[k]) //顶点k未加入S,且绕过u可以缩短路径
{
dist[k]=dist[u]+w;
path[k]=u; //k到u有边相连 //修改到k的最短路径
}
}
}
};
void ShowMin(int v,int x)
{
int j,k,n;
n=NumberOfPoints();
int *d=new int[n];
{
j=x;
k=0;
while(j!=v)
{
d[k++]=j;
j=path[j];//path是指与j相连的上一个结点
}
cout<<p[v].name<<"到"<<p[x].name<<"的最短路径为:"<<endl<<p[v].name;
while(k>0)
{
cout<<"-->"<<p[d[--k]].name;
}
cout<<endl<<"最短路径长度为:"<<dist[x]<<"米"<<endl;
}
delete[] d;
};
//查询两景点间最短距离
void minest()
{
system("cls");
Load_List();
int v1,v2;
char code1,code2;
cout << "编号如上图,请输入您要查询的两个景点的编号:"<<endl;
cout <<"起始景点:";
cin>>code1;
cout <<"终止景点:";
cin>>code2;
while(1)
{
v1=getPointPos(code1);
v2=getPointPos(code2);
if(v1==-1||v2==-1)
{
cout <<"输入错误,请重新输入"<<endl;
cout <<"起始景点:";
cin >>code1;
cout <<"终止景点:";
cin>>code2;
}
else
{
MinPath(v1);
ShowMin(v1,v2);
break;
}
}
cout <<"按回车键继续";
getchar();
getchar();
};
int main() {
minest();
return 0;
}