校园导航系统不是很难,因为最短路径已经有了Dijkstra算法,这就可以直接用。

我们需要的只是往这个算法里面加参数还有对界面的创作,这些都很简单。不过用算法还得需要了解算法,所以建议大家还是去理解一下这个算法的内涵。实际运行可能和我的运行结果有出入,应该只是显示的问题。

前期准备:

呈现结果:

代码如下:

#include#include#include#include//导入头文件#define MaxLen 1000//define可以定义一个标识符为一个常量,此处将MaxLen定义为无穷大方便后续算法之中使用#define Max 100//定义最大容量为100void InitDis();//初始化map数组里面的各种距离信息void Dijkstra(int v0,int s);//Dijkstra最短路径算法void MapList();//地图界面void Welcome();//欢迎界面void Menu();//菜单界面void BuildList();//景点信息界面void Quit();//退出界面void MenuSystem();//菜单逻辑int map[Max][Max],Flag[Max],Dis[Max];char name[37][50]={"","西门","西二门","孝武综合楼","天工/天成楼","湛林体育馆","南三门","湖西路","平桥","校医院","拱桥","西区宿舍","孔子广场","南二门","经法/外语楼","樱花林","体育楼","格物楼","西苑/西霞餐厅","校史馆","教六","北门","图书馆","教一","明德楼","喷泉广场","计科楼","南大门","音乐/美术楼","三里餐厅","三里宿舍","湖东路","东苑餐厅","东区宿舍","广播台","人文广场","东门"};//此处可以使用结构体也可以使用像我一样的二维数组,但是注意我的二维数组的第一个是空的,以便后续输出的时候序号和建筑物一对一。 void InitDis()//初始化距离信息{int i,j;for(i=1;i<=36;i++)//初始化map,使得景点自己和自己的距离为0,剩下的距离为无穷大。for(j=1;j<=36;j++){if(i==j)map[i][j]=0;elsemap[i][j]=MaxLen;}//此处存储各个景点之间的距离。注意一定要按顺序来,例如不可以先map[2][5]再[2][3],因为后面的for循环会覆盖掉 map[1][5]=100;map[2][3]=105;map[2][5]=128;map[2][7]=150;map[2][8]=200;map[3][6]=50;map[4][5]=40;map[4][7]=70;map[5][7]=50;map[6][9]=30;map[7][10]=120;map[7][14]=450;map[7][15]=400;map[8][11]=47;map[9][12]=120;map[10][17]=60;map[11][12]=50;map[11][18]=50;map[12][13]=50;map[12][20]=50;map[14][15]=120;map[14][22]=158;map[15][22]=40;map[16][17]=30;map[16][18]=120;map[16][23]=150;map[16][31]=300;map[17][18]=100;map[18][19]=57;map[19][20]=200;map[19][23]=40;map[19][24]=34;map[20][24]=212;map[21][35]=50;map[22][35]=50;map[22][28]=106;map[23][24]=73;map[23][31]=200;map[23][32]=150;map[23][33]=120;map[24][25]=80;map[24][33]=100;map[25][26]=30;map[25][27]=100;map[25][34]=40;map[28][29]=100;map[28][35]=70;map[28][31]=230;map[29][30]=50;map[29][31]=200;map[30][31]=200;map[31][32]=200;map[32][33]=100;map[32][36]=250;map[33][34]=170;for(i=1;i<=36;i++){for(j=1;j<=36;j++){map[j][i]=map[i][j];}}}void Dijkstra(int v0,int s)//v0是起点,s是终点。迪杰斯特拉求最短路径,并输出路线 {int min,i,j,u,v;//初始化各个数据int p[Max],l[Max];//这里尽可能的定义把数组定义大为了防止出现不够存的现象,坏处就是占用内存。memset(p,-1,sizeof(p));//将p的前sizeof(p)个长度的数值都改成unsigned(-1)。unsigned(-1)就是最大数,此处要温习反码补码知识。memset(l,0,sizeof(l));//将l的所有长度的数值都改成unsigned(0)也就是0。memset(Flag,0,sizeof(Flag));//memset(*,0,sizeof(*))这个函数常常用来清空数组。//以下正式开始Djikstra算法,建议先去理解算法的含义再来理解代码。for(i=1;i<=36;i++){Dis[i]=map[v0][i];if(Dis[i]<MaxLen){p[i]=v0;}}Flag[v0]=1;//标记for(i=1;i<36;i++){min=MaxLen;for(j=1;j<=36;j++) {if(Flag[j]==0&&Dis[j]<min){min=Dis[j];u=j;}}Flag[u]=1; for(v=1;vDis[u]+map[u][v]){p[v]=u; Dis[v]=Dis[u]+map[u][v];}}}v=s;i=1;while(p[v]!=v0){l[i++]=p[v];v=p[v];}printf("\n");u=i-1;printf("为您规划的最短路线为:");printf("%s--->",name[v0]);for(i=u;i>=1;i--)printf("%s--->",name[l[i]]); printf("%s\n",name[s]);printf("全程%d米",Dis[s]);printf(" 用时%d分钟\n",Dis[s]/60+1);}void MapList() //地图界面{printf("┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━━━━━━━ 北门━━━━━━┓\n");printf("┃┃┃ 人文广场┃\n");printf("【湖北工程学院】┃┃┃o经法/外语楼o┗━━┓\n");printf("【本院地图】┃┃┃o ┃音乐/美术楼\n");printf("┃┃┃樱花林图书馆┗━━━┓\n");printf("┃┃┃o oo┃三里餐厅\n");printf("┏━━━━━━━━━━━━━━━┛┃┃┃\n");printf("┃┃┃┗━━━━━━┓\n");printf("┃ 天工/天成楼┗━━┛ ┃\n");printf("┃o【春晖湖】 o┃\n");printf("┃o湖东路三里宿舍┃ \n");printf("┃拱桥 ┃\n");printf(" 西门湛林 湖西路o ┃\n");printf("┃体育馆o o体育楼┗━━━━━━━┓\n");printf("┃o o格物楼 o东苑餐厅┃ \n");printf("┃ o教一东门\n");printf("┃o西苑/西霞餐厅 ┃\n");printf("西二门o平桥o o校史馆 o东区宿舍┃\n");printf("┗┓西区宿舍o明德楼 ┃ \n");printf(" ┃o孝武综合楼oo教六 ┃ \n");printf(" ┗━┓o 孔子广场 喷泉广场 广播台 ┏━━━━━━━━━━━━┛ \n");printf(" ┗━━ 南三门━━━━━━━━━ 南二门━━━━━━━━━━━━━━━┓ o o┏━━━━━━━┛\n");printf("校医院┃ ┏━━┛ \n");printf("┃计科楼┏━━━━┛ \n");printf("┃o ┃\n");printf("┗━━ 南大门━┛ \n\n");}void Welcome()//欢迎界面{printf("——————————————————————————————————\n\n");printf("【湖工校园导航系统】\n\n");printf(" 欢迎使用湖工校园导航系统\n");printf("(导航数据仅供参考,并不代表实际)\n\n");printf("——————————————————————————————————\n\n");system("pause");system("cls");}void BuildList()//建筑物一览图{printf("——————————————————————————————————\n\n");printf("【湖工校园导航系统】\n");printf(" 校园一览图\n\n");printf("(1)西门(2)西二门(3)孝武综合楼(4)天工/天成楼 (5)湛林体育馆\n\n");printf("(6)南三门(7)湖西路(8)平桥(9)校医院(10)拱桥\n\n");printf("(11)西区宿舍 (12)孔子广场 (13)南二门 (14)经法/外语楼(15)樱花林\n\n");printf("(16)体育楼 (17)格物楼 (18)西苑/霞餐厅(19)校史馆 (20)教六\n\n");printf("(21)北门 (22)图书馆 (23)教一 (24)明德楼 (25)喷泉广场\n\n");printf("(26)计科楼 (27)南大门 (28)音乐/美术楼(29)三里餐厅 (30)三里宿舍\n\n");printf("(31)湖东路 (32)东苑餐厅 (33)东区宿舍 (34)广播台 (35)人文广场\n\n");printf("(36)东门\n\n");printf("——————————————————————————————————\n\n");}void Menu()//菜单界面{system("cls");printf("——————————————————————————————————\n\n");printf(" 【湖工校园导航系统】\n\n");printf("(1) 查看地图\n\n");printf("(2)查看校园一览图\n\n");printf("(3) 进入导航\n\n");printf("(4) 退出导航系统\n\n\n");printf("——————————————————————————————————\n\n");}void Quit()//退出界面{system("cls");printf("——————————————————————————————————\n\n");printf("【湖工校园导航系统】\n\n");printf("感谢您使用湖工导航系统!\n\n");printf(" 作者:20541班李小澈\n\n");printf("——————————————————————————————————\n\n");}void MenuSystem()//菜单逻辑{int n,i;while(1){int v0=0,s=0;Menu();printf("请输入您要进行的操作:");scanf("%d",&n);switch(n){case 1:{system("cls");MapList();printf("返回主菜单");system("pause");}break;case 2:{system("cls");BuildList();printf("返回主菜单");system("pause");}break;case 3:{system("cls");BuildList();while(v036){printf("请输入您的起始地:");scanf("%d",&v0);if(v036){printf("输入有误!请重新输入。\n");}}while(s36){printf("请输入您的目的地:");scanf("%d",&s);if(s36){printf("输入有误!请重新输入。\n");}}system("cls");MapList();Dijkstra(v0,s);printf("返回主菜单");system("pause");}break;case 4:{Quit();exit(-1);}break;default: {printf("输入错误!请重新输入。\n");printf("返回主菜单");system("pause");}break;}}}int main()//主函数{InitDis();Welcome();MenuSystem();}