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

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

前期准备:

呈现结果:

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>//导入头文件

#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]<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;v<=36;v++)
		{
			if(Flag[v]==0&&Dis[v]>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("%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         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("                                              ┗━━ 南大门━┛                                                           \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(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();
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐