我们不造轮子,我们只是轮子的搬运工。
校园导航系统不是很难,因为最短路径已经有了Dijkstra算法,这就是一个轮子,可以直接用。
我们需要的只是往这个算法里面加参数还有对界面的创作,这些都很简单。不过用轮子还得需要了解轮子,所以建议大家还是去理解一下这个算法的内涵。实际运行可能和我的运行结果有出入,应该只是显示的问题。
前期准备:
呈现结果:
代码如下:
#include#include #include #include//导入头文件 #define MaxLen 1000//define可以定义一个标识符为一个常量,此处将MaxLen定义为无穷大方便后续算法之中使用 #define Max 100//定义最大容量为100 void 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; else map[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] Dis[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("%sn",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 o o┃三里餐厅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孝武综合楼 o o教六 ┃ n"); printf(" ┗━┓ o 孔子广场 喷泉广场 广播台 ┏━━━━━━━━━━━━┛ n"); printf(" ┗━━ 南三门━━━━━━━━━ 南二门━━━━━━━━━━━━━━━┓ o o┏━━━━━━━┛n"); printf(" 校医院 ┃ ┏━━┛ n"); printf(" ┃计科楼 ┏━━━━┛ n"); printf(" ┃ o ┃ n"); printf(" ┗━━ 南大门━┛ nn"); } void Welcome()//欢迎界面 { printf("——————————————————————————————————nn"); printf(" 【湖工校园导航系统】nn"); printf(" 欢迎使用湖工校园导航系统n"); printf(" (导航数据仅供参考,并不代表实际)nn"); printf("——————————————————————————————————nn"); system("pause"); system("cls"); } void BuildList()//建筑物一览图 { printf("——————————————————————————————————nn"); printf(" 【湖工校园导航系统】n"); printf(" 校园一览图nn"); printf("(1)西门 (2)西二门 (3)孝武综合楼 (4)天工/天成楼 (5)湛林体育馆nn"); printf("(6)南三门 (7)湖西路 (8)平桥 (9)校医院 (10)拱桥nn"); printf("(11)西区宿舍 (12)孔子广场 (13)南二门 (14)经法/外语楼(15)樱花林nn"); printf("(16)体育楼 (17)格物楼 (18)西苑/霞餐厅(19)校史馆 (20)教六nn"); printf("(21)北门 (22)图书馆 (23)教一 (24)明德楼 (25)喷泉广场nn"); printf("(26)计科楼 (27)南大门 (28)音乐/美术楼(29)三里餐厅 (30)三里宿舍nn"); printf("(31)湖东路 (32)东苑餐厅 (33)东区宿舍 (34)广播台 (35)人文广场nn"); printf("(36)东门nn"); printf("——————————————————————————————————nn"); } void Menu()//菜单界面 { system("cls"); printf("——————————————————————————————————nn"); printf(" 【湖工校园导航系统】nn"); printf(" (1) 查看地图nn"); printf(" (2) 查看校园一览图nn"); printf(" (3) 进入导航nn"); printf(" (4) 退出导航系统nnn"); printf("——————————————————————————————————nn"); } void Quit()//退出界面 { system("cls"); printf("——————————————————————————————————nn"); printf(" 【湖工校园导航系统】nn"); printf(" 感谢您使用湖工导航系统!nn"); printf(" 作者:20541班 李小澈nn"); printf("——————————————————————————————————nn"); } 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(v0<1||v0>36) { printf("请输入您的起始地:"); scanf("%d",&v0); if(v0<1||v0>36) { printf("输入有误!请重新输入。n"); } } while(s<1||s>36) { printf("请输入您的目的地:"); scanf("%d",&s); if(s<1||s>36) { 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(); }



