程序设计基础课程设计之校园导航系统2.0版本

这是2.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;
}

//景点编号及名称指引界面 
void Load_List(){
	system("cls");
	cout<<"     *************************************************************************    "<<endl;
	cout<<"     **                          欢迎来到南京理工大学!                     **     "<<endl;
	cout<<"     **                          以下为景点编号及名称                       **     "<<endl;
	cout<<"     *************************************************************************     "<<endl;
	cout<<"     **    (1)一号门            (2)二号门           (3)三号门         **     "<<endl;	
	cout<<"     **    (4)四号门            (5)五号门           (6)南大门         **     "<<endl;	
	cout<<"     **    (7)七号门            (8)竹园小区快递点   (9)校医院         **     "<<endl;	
	cout<<"     **    (10)体育中心         (11)风味美食广场    (12)第二运动场    **     "<<endl;	
	cout<<"     **    (13)冶园             (14)和平园(水杉林)(15)时间广场      **     "<<endl;
	cout<<"     **    (16)紫霞湖(艺文馆) (17)学术交流中心    (18)二道门        **     "<<endl;
	cout<<"     **    (19)二工             (20)一工            (21)三工          **     "<<endl;
	cout<<"     **    (22)阳光体育长廊     (23)致远楼          (24)银杏广场      **     "<<endl;
	cout<<"     **    (25)图书馆           (26)逸夫楼          (27)四工          **     "<<endl;
	cout<<"     **    (28)明苑美食广场     (29)紫麓宾馆        (30)自动化院      **     "<<endl;
	cout<<"     *************************************************************************     "<<endl;
	return;
}

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<30;i++)
	{
		min= Infinify;
		for(j=1;j<=30;j++)			//每次找出距离v0最近点 
		{
			if(book[j]==0&&dis[j]<min)
			{
				min=dis[j];
				u=j;
			}
		}
		book[u]=1;			//标记该点 
		for(v=1;v<=30;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;
}

void minest()
{
    Load_Map();
    Load_List();
	int v1,v2;
	cout << "编号如上图,请输入您要查询的两个景点的编号:"<<endl;
	cout <<"起始景点:";
	cin>>v1;
	cout <<"终止景点:";
	cin>>v2;
	Dijkstra(v1,v2);
};


//起始页 
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 << "***                                       输入6    增加景点和道路(该功能为管理员功能)                         ***" << 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 3: //查询两景点间最短距离
		      minest();
		      break;		
		}
	return 0; // 返回退出
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值