利用图结构、Floyd算法求最短路径做校内导航系统。
源代码:
#include "stdafx.h"
#include <iostream>
#include <string>
#define MAX 10000
using namespace std;
struct Data
{
intnum;
charname[50];
charintroduce[100];
};
class School
{
private:
Datadate[11];
intdistance[11][11];
intPath[11][11];
intShortestDistance[11][11];
public:
School();
~School(){}
voidFloyd();
voidIntroduce(int);
voidprint(int ,int);
void ShortDistance();
voidMap();
};
School::School()
{
inti,j;
for(i=1;i<=10;i++)
{
date[i].num=i;
switch(i)
{
case 1:
strcpy(date[1].name,"西安石油大学图书馆");
strcpy(date[1].introduce,"西安石油大学标志性建筑物,全校以此图书馆为中心展开。");
case2:
strcpy(date[2].name,"A区教学楼");
strcpy(date[2].introduce,"也被称为第一教学楼,用于上课教学,大多小教室。");
case 3:
strcpy(date[3].name,"B区教学楼");
strcpy(date[3].introduce,"也被称为第二教学楼,用于上课教学,全为大教室。");
case 4:
strcpy(date[4].name,"经管人文楼");
strcpy(date[4].introduce,"专为经济管理学院和人文科学学院设置的办公楼。");
case 5:
strcpy(date[5].name,"新食堂");
strcpy(date[5].introduce,"也被称为第二食堂,一楼二楼为普通食堂,三楼包含清真食堂。");
case 6:
strcpy(date[6].name,"老食堂");
strcpy(date[6].introduce,"也被称为第一食堂,一楼包含普通食堂和清真食堂,二楼为普通食堂,三楼为腾辉大学生活动中心。");
case 7:
strcpy(date[7].name,"老操场");
strcpy(date[7].introduce,"老操场旁为学校校医务室和课外拓展基地。老操场有乒乓球场、排球场、网球场。");
case 8:
strcpy(date[8].name,"新操场");
strcpy(date[8].introduce,"新操场有舞蹈室、生活超市。");
case 9:
strcpy(date[9].name,"北门");
strcpy(date[9].introduce,"门口为沣京大道。门口有去往各地的公交车站点。");
case 10:
strcpy(date[10].name,"东门");
strcpy(date[10].introduce,"门口有各种小吃,门口对面有超市、酒店、各种特色的饭馆。");
break;
}
}
for(i=1;i<=10;i++)
{
ShortestDistance[i][i]=0;
}
for(i=1;i<=10;i++)
{
for(j=1;j<=10;j++)
{
distance[i][j]=MAX;
}
}
distance[1][2]=distance[2][1]=400;
distance[1][3]=distance[3][1]=300;
distance[1][4]=distance[4][1]=300;
distance[1][9]=distance[9][1]=1000;
distance[1][10]=distance[10][1]=1000;
distance[2][3]=distance[3][2]=300;
distance[2][6]=distance[6][2]=700;
distance[2][7]=distance[7][2]=800;
distance[3][4]=distance[4][3]=100;
distance[3][5]=distance[5][3]=600;
distance[4][5]=distance[5][4]=500;
distance[4][8]=distance[8][4]=400;
distance[4][10]=distance[10][4]=800;
distance[5][8]=distance[8][5]=500;
distance[6][7]=distance[7][6]=500;
distance[8][10]=distance[10][8]=700;
distance[1][1]=distance[2][2]=distance[3][3]=distance[4][4]=0;
distance[5][5]=distance[6][6]=distance[7][7]=distance[8][8]=0;
distance[9][9]=distance[10][10]=0;
}
void School::Introduce(int i)
{
cout<<"地点代号:"<<date[i].num<<endl;
cout<<"地点名称:"<<date[i].name<<endl;
cout<<"地点介绍:"<<date[i].introduce<<endl;
}
void School::Floyd()
{
int i,j,k;
for(i=1;i<=10;i++)
{
for(j=1;j<=10;j++)
{
ShortestDistance[i][j]=distance[i][j];
Path[i][j]=0;
}
}
for(i=1;i<=10;i++)
{
for(k=1;k<=10;k++)
{
for(j=1;j<=10;j++)
{
if(ShortestDistance[i][j]>(ShortestDistance[i][k]+ShortestDistance[k][j]))
{
ShortestDistance[i][j]=ShortestDistance[i][k]+ShortestDistance[k][j];
Path[i][j]=k;
Path[j][i]=k;
}
}
}
}
}
void School::Map()
{
printf("\n");
printf(" ┏━━━━━━━┓\n");
printf(" ┃ 9.北门 ┃ \n");
printf(" ┗━━━┳━━━┛\n");
printf(" ┃ \n");
printf(" ┃ \n");
printf(" ┃ \n");
printf(" ┃ ┏━┓\n");
printf(" ┏━━━┻━━━┓ ┃ ┃\n");
printf(" ┏━━━━━━━┓ ┃ ┃ ┃10┃ \n");
printf(" ┃ ┃ ┃ ┃ ┃东┃\n");
printf(" ┃ 6.老食堂 ┣━━━━━━━┳━━━━━┫ 1.图书馆 ┣┳━━━━━━━━━━━━━━━┫ ┃ \n");
printf("┃ ┃ ┏━━━┻━━━┓ ┃ ┃┃ ┃门┃\n");
printf(" ┗━━━┳━━━┛ ┃ ┃ ┃ ┃┃ ┃ ┃\n");
printf(" ┃ ┃ 2.A区教学楼 ┃ ┗━━━┳━━━┛┃ ┃ ┃\n");
printf(" ┃ ┃ ┃ ┃ ┃ ┗┳┛\n");
printf(" ┃ ┗━━━┳━━━┛ ┃ ┃ ┃ \n");
printf(" ┏━━━┻━━━┓ ┃ ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃┏━━━━━━━┓┃┏━━━┻━━━┓ ┃\n");
printf(" ┃ ┃ ┃┃ ┃┃┃ ┃ ┃ \n");
printf(" ┃ 7.老操场 ┣━━━━━━━┻┫ 3.B区教学楼 ┣╋┫ 4.经管人文楼 ┣━━━━━━━━━━━━┫ \n");
printf(" ┃ ┃ ┃ ┃┃┃ ┃ ┏━━━┻━━━┓ \n");
printf(" ┃ ┃ ┗━━━━━━━┛┃┗━━━┳━━━┛ ┃ ┃ \n");
printf(" ┃ ┃ ┃ ┃ ┃ ┃ \n");
printf(" ┗━━━━━━━┛ ┃ ┃ ┃ 8.新操场 ┃ \n");
printf(" ┃ ┃ ┃ ┃ \n");
printf(" ┃ ┃ ┃ ┃\n");
printf(" ┃┏━━━┻━━━┓ ┃ ┃ \n");
printf(" ┃┃ ┃ ┗━━━┳━━━┛ \n");
printf(" ┗┫ 5.新食堂 ┣━━━━━━━━━━━━┛\n");
printf(" ┃ ┃ \n");
printf(" ┗━━━━━━━┛ \n");
}
void School::print(int i,int j)
{
inta,b,k=0;
a=i;
b=j;
inttemp[11];
cout<<"两地点间最短路径是:"<<endl;
if(ShortestDistance[i][j]!=MAX)
{
cout<<a;
if(i<j)
{
while(Path[i][j]!=0)
{
temp[k++]=Path[i][j];
j=Path[i][j];
}
for(k=k-1;k>=0;k--)
cout<<"->"<<temp[k];
}
else
{
while(Path[i][j]!=0)
{
cout<<"->"<<Path[i][j];
i=Path[i][j];
}
}
cout<<"->"<<b<<endl;
}
cout<<a<<"号地点"<<"->"<<b<<"号地点"<<"之间的最短距离是"<<ShortestDistance[a][b]<<"米"<<endl;
cout<<endl;
}
void School::ShortDistance()
{
inti,j;
cout<<"请输入要查询的两个地点的编号(1~10的数字编号并用空格间隔):";
cin>>i>>j;
Floyd();
print(i,j);
}
int main()
{
Schoolt;
chark;
inti;
printf("\n\n 西安石油大学校园问询系统\n");
printf(" ┏━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf(" ┃编号┃ 功 能 ┃\n");
printf(" ┣━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf(" ┃ a ┃ 查 看 学 校 平 面 图 ┃\n");
printf(" ┃ b ┃ 查 看 地 点 信 息 ┃\n");
printf(" ┃ c ┃ 查 找 两 地 点 间 最 短 路 径 ┃\n");
printf(" ┃ d ┃ 退 出 该 系 统 ┃\n");
printf(" ┗━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("输入你的选择:");
while(k!='d')
{
cin>>k;
switch(k)
{
case 'a':;
t.Map();
case 'b':
cout<<"地点简介查询(请输入1~10):";
cin>>i;
t.Introduce(i);
break;
case 'c':
t.ShortDistance();
break;
case 'd':;
break;
default:printf("输入错误,请重新输入。\n");
}
printf("\n\n请再输入你的选择:");
}
printf("是否确认退出?\n\n");
}