经过整合,信息查询功能,两点间最短路径路程功能实现,不同出行方式最短时间实现,管理员increase函数功能基本实现,但是增加之后存在问题,不能继续执行minest函数和mintime函数,将在5.0版本进行改善
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<iomanip>
#define Infinify 65536 //定义无穷大
#include<windows.h>
using namespace std;
int sum=30; //全局变量记录景点总数
int map[100][100],book[100],dis[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;
}
int maxPoint=100;
int numPoints=30;
//景点编号及名称指引界面
void Load_List(){
system("cls") ;
cout<<endl<<endl<<endl<<endl;
cout << "************************************************************" << endl;
cout << "*** 景点编号如下: ***" << endl;
for(int i=1;i<=numPoints;i++)
{
if(i<=9){cout <<" "<<i<<std::left<<setw(17)<<p[i].name;
}
else cout <<i<<std::left<<setw(17)<<p[i].name;//std::left 左对齐 setw(17) 占十七行内容
if(i%3==0)
cout <<endl;
}
cout <<endl<< "*************************************************************" << endl;
return;
}
//景点信息查询
void search()
{
int i;
Load_Map();
Load_List();
cout <<"请输入要查询的景点编号:";
cin>>i;
if(i>numPoints||i<1)
{
cout <<"输入错误,请重新输入"<<endl;
}
else
{
cout << " 景点代号:" << i << endl;
cout << " 景点名称:" << p[i].name << endl;
cout << " 景点简介:" << p[i].des<< endl;
cout << "***************************************" << endl;
cout <<"按回车键继续";
getchar();
getchar();
}
};
void Dijkstra(int v0,int s) //迪杰斯特拉求最短路径,并输出路线
{
int min,i,j,u,v;
int q[110],l[110];
memset(q,-1,sizeof(q));
memset(l,0,sizeof(l));
memset(book,0,sizeof(book));
for(i=1;i<=30;i++)
{
dis[i]=map[v0][i];
if(dis[i]< Infinify) //v0能直接到达,即上一站点为v0
q[i]=v0;
}
book[v0]=1;
for(i=1;i<numPoints;i++)
{
min= Infinify;
for(j=1;j<=numPoints;j++) //每次找出距离v0最近点
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1; //标记该点
for(v=1;v<=numPoints;v++)
{
if(book[v]==0&&dis[v]>dis[u]+map[u][v]) //通过最近点更新其他边
{
q[v]=u; //存储更新的边,即为路线
dis[v]=dis[u]+map[u][v];
}
}
}
v=s;
i=1;
while(q[v]!=v0) //将路线存入栈中,正序输出
{
l[i++]=q[v];
v=q[v];
}
u=i-1;
cout<<"路线为:"<<endl;
cout<<p[v0].name<<"--->";
for(i=u;i>=1;i--)
cout<<p[l[i]].name<<"--->";
cout<<p[s].name<<endl;
cout<<"最短路径长度为:"<<dis[s]<<"米"<<endl;
}
int Dijkstra2(int v0,int s) //迪杰斯特拉求最短路径,并输出路线
{
int min,i,j,u,v;
int q[110],l[110];
memset(q,-1,sizeof(q));
memset(l,0,sizeof(l));
memset(book,0,sizeof(book));
for(i=1;i<=numPoints;i++)
{
dis[i]=map[v0][i];
if(dis[i]< Infinify) //v0能直接到达,即上一站点为v0
q[i]=v0;
}
book[v0]=1;
for(i=1;i<numPoints;i++)
{
min= Infinify;
for(j=1;j<=numPoints;j++) //每次找出距离v0最近点
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1; //标记该点
for(v=1;v<=numPoints;v++)
{
if(book[v]==0&&dis[v]>dis[u]+map[u][v]) //通过最近点更新其他边
{
q[v]=u; //存储更新的边,即为路线
dis[v]=dis[u]+map[u][v];
}
}
}
v=s;
i=1;
while(q[v]!=v0) //将路线存入栈中,正序输出
{
l[i++]=q[v];
v=q[v];
}
u=i-1;
cout<<"路线为:"<<endl;
cout<<p[v0].name<<"--->";
for(i=u;i>=1;i--)
cout<<p[l[i]].name<<"--->";
cout<<p[s].name<<endl;
return dis[s];
}
void minest()
{
Load_Map();
Load_List();
int v1,v2;
cout << "编号如上图,请输入您要查询的两个景点的编号:"<<endl;
cout <<"起始景点:";
cin>>v1;
cout <<"终止景点:";
cin>>v2;
Dijkstra(v1,v2);
};
void mintime(float length, const std::string& str) {
float speed1 = 78; // 步行速度
float speed2 = 200; // 骑行速度
float speed3 = 500; // 开车速度//单位待定
float time;
if (str == "walk") {
time = length / speed1;
std::cout << "步行需要的时间为 " << time << " 分钟" << std::endl;
} else if (str == "bike") {
time = length / speed2;
std::cout << "骑车需要的时间为 " << time << " 分钟" << std::endl;
} else if (str == "car") {
time = length / speed3;
std::cout << "开车需要的时间为 " <<time << " 分钟" << std::endl;
} else {
std::cout << "未支持的出行方式,请输入 'walk', 'bike', 或 'car'。" << std::endl;
}
}
bool insertPoint(int code,string name,string des)
{
if(numPoints==maxPoint)
{
cout<<"景点数已经达到最大值!";
return false;
}
p[code].name=name;
p[code].des=des;
return true;
};
int Increase()
{
system("cls");
printf("请输入管理员密码:");
int key;
cin>>key;
if(key==123456){
int f;
system("cls");
Load_Map();
Load_List();
int code;
string name;
string des;
numPoints++;
code=numPoints;
cout <<"请输入要增加的景点的名称:";
cin>>name;
cout <<"请输入要增加的景点的简介:";
cin>>des;
insertPoint(code,name,des);
cout<<"请问需要进行距离增添吗?需要输入1,不需要输入2";
int k;
cin>>k;
if(k=1){
int v1,v2,length;
cout<<"起始景点:";
cin>>v1;
cout<<"终止景点:";
cin>>v2;
cout <<"请输入两景点间的距离:";
cin>>length;
map[v1][v2]=length;
cout<<"按回车键继续";
getchar();
getchar();
}
if(k=2){
getchar();
getchar();
}
cout <<"按回车键继续";
getchar();
getchar();
}
else{printf("对不起,您输入的密码错误,不能执行该操作!\n输入回车键返回");
getchar();
getchar();
return 0;
}
};
//起始页
void start()
{
int i;
for(i=0; i<5; i++)
cout<<endl;
cout<<" *********************************************"<<endl;
cout<<" ** **"<<endl;
cout<<" ** 欢迎使用南京理工大学校园导航系统 **"<<endl;
cout<<" ** **"<<endl;
cout<<" *********************************************"<<endl;
for(i=0; i<5; i++)
cout<<endl;
cout<<"按回车键继续......";
getchar();
}
//菜单页
void meau()
{ cout << "*****************************************************************************************************************" << endl;
cout << "*** 请选择你需要实现的功能~ ***"<<endl;
cout << "*****************************************************************************************************************" << endl;
cout << "*** ***" << endl;
cout << "*** 输入1 景点信息查询 ***" << endl;
cout << "*** 输入2 增加景点和道路(管理员专属) ***" << endl;
cout << "*** 输入3 查询两景点间最短距离 ***" << endl;
cout << "*** 输入4 查询两景点间采用不同出行方式的最短时长 ***" << endl;
cout << "*** 输入5 查询多个景点间的最佳路径 ***" << endl;
cout << "*** 输入0 退出本系统 ***" << endl;
cout << "*** ***" << endl;
cout << "*****************************************************************************************************************" << endl;
}
int main() {
MessageBox(NULL,"确认进入南京理工大学校园导航系统?!","欢迎使用南理工校园导航系统!",MB_OK);
system("color F9");
start();
system("cls");
meau();
cout << "请输入您要执行功能的编号:(请输入数字!)" ;
int c;
cin>>c;
if(c<0||c>5)
{
cout <<"输入不符合要求,请重新输入!"<<endl;
}
switch (c)
{
case 0: //结束程序
cout<<"谢谢您的使用!"<<endl;
return 0;
case 1://景点信息查询
search();
break;
case 2://增加景点和道路
Increase();
break;
case 3: //查询两景点间最短距离
minest();
break;
case 4://查询两景点间采用不同出行方式的最短时长
float length;
string ways;
cout << "请您输入您的出行方式, 'walk', 'bike', 或者'car': ";
cin>>ways;
int v1,v2;
Load_Map();
Load_List();
cout << "编号如上图,请输入您要查询的两个景点的编号:"<<endl;
cout <<"起始景点:";
cin>>v1;
cout <<"终止景点:";
cin>>v2;
length=Dijkstra2(v1,v2);
mintime(length,ways);
break;
}
return 0; // 返回退出
}