校园导游咨询(图的应用)

[问题描述]

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景息;点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信

(2)提供基本信息的修改功能;

(3)为来访客人提供图中任意景点相关信息的查询;

(4)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。

#include<cstdio>
#include<iostream>
#include<cstring>
#define inf 50
using namespace std;

const int Max_n=1000;
 
typedef struct {//景点相关信息 
	char name[Max_n];//景点名称 
	char number[Max_n];//景点代号
	char Introduce[Max_n]; 
}DataType;

typedef struct {//景点 
	int num;//编号
	DataType data;//相关信息 
}ScSpot;

typedef struct {//
	ScSpot Scspot[12];//十一个景点,0号位置不使用
	int D[12][12];//构建矩阵,景点间的距离 
}UDG;//这个类型包含了各个景点的关系,各个景点的基本信息 

UDG G;
int Path[12][12];
int D[12][12];

/*初始化景点信息*/ 
void InitMes(){
	int count=1; 
	G.Scspot[count].num=1;
	strcpy(G.Scspot[count].data.number,"TS001");
	strcpy(G.Scspot[count].data.name,"图书馆");
	strcpy(G.Scspot[count].data.Introduce,"提供各种各样的书,适于阅读,学习!");
	count++;
	G.Scspot[count].num=2;
	strcpy(G.Scspot[count].data.number,"TS002");
	strcpy(G.Scspot[count].data.name,"体育馆");
	strcpy(G.Scspot[count].data.Introduce,"这里有各种运动的场地!");
	count++;
	G.Scspot[count].num=3;
	strcpy(G.Scspot[count].data.number,"TS003");
	strcpy(G.Scspot[count].data.name,"北苑操场");
	strcpy(G.Scspot[count].data.Introduce,"一些大型活动的举办地点!");
	count++;
	G.Scspot[count].num=4;
	strcpy(G.Scspot[count].data.number,"TS004");
	strcpy(G.Scspot[count].data.name,"南苑操场");
	strcpy(G.Scspot[count].data.Introduce,"乐于运动的人的眼中好地方!");
	count++;
	G.Scspot[count].num=5;
	strcpy(G.Scspot[count].data.number,"TS005");
	strcpy(G.Scspot[count].data.name,"湿地公园");
	strcpy(G.Scspot[count].data.Introduce,"安静美好,适宜游玩,拍照!");
	count++;
	G.Scspot[count].num=6;
	strcpy(G.Scspot[count].data.number,"TS006");
	strcpy(G.Scspot[count].data.name,"工业训练中心");
	strcpy(G.Scspot[count].data.Introduce,"各专业金工实习地点!");
	count++;
	G.Scspot[count].num=7;
	strcpy(G.Scspot[count].data.number,"TS007");
	strcpy(G.Scspot[count].data.name,"海豚湾");
	strcpy(G.Scspot[count].data.Introduce,"此地风景美好!");
	count++;
	G.Scspot[count].num=8;
	strcpy(G.Scspot[count].data.number,"TS008");
	strcpy(G.Scspot[count].data.name,"科技园");
	strcpy(G.Scspot[count].data.Introduce,"emmmm还没去过!,暂无简介!");
	count++;
	G.Scspot[count].num=9;
	strcpy(G.Scspot[count].data.number,"TS009");
	strcpy(G.Scspot[count].data.name,"北苑食堂");
	strcpy(G.Scspot[count].data.Introduce,"里面的饭挺好吃的,吃货们可以关注一下!");
	count++; 
	G.Scspot[count].num=10;
	strcpy(G.Scspot[count].data.number,"TS010");
	strcpy(G.Scspot[count].data.name,"滴水涌泉");
	strcpy(G.Scspot[count].data.Introduce,"很多活动的报名地点!");
	count++;
	G.Scspot[count].num=11;
	strcpy(G.Scspot[count].data.number,"TS011");
	strcpy(G.Scspot[count].data.name,"3号组团楼");
	strcpy(G.Scspot[count].data.Introduce,"里面有一个大礼堂,可以参观一下!");
	count++;
	for(int i=1;i<=12;i++){
		for(int j=1;j<=12;j++){
			if(i==j){
				G.D[i][j]=0;
				D[i][j]=0;
			}else{
				G.D[i][j]=inf;
				D[i][j]=inf;	
			}	
		}
	}
	G.D[1][2]=1;G.D[2][3]=9;G.D[2][4]=2;G.D[1][4]=4;
	G.D[3][1]=3;G.D[3][2]=5;G.D[3][4]=8;G.D[4][3]=6;
} 
/*修改景点信息*/
void ChangeSpeMes(int i){//在修改时务必输入不冲突的信息 
	printf("------------------------------\n");
	printf("1.景点代号\n");
	printf("2.景点名称\n");
	printf("3.景点简介\n");
	printf("------------------------------\n"); 
	printf(">>请选择您要修改的景点信息:"); 
	int chose;
	scanf("%d",&chose);
	if(chose==1){
		printf("请直接输入修改后的景点后的景点代号:");
		scanf("%s",G.Scspot[i].data.number);
	}
	else if(chose==2){
		printf("请直接输入修改后的景点后的景点名称:");
		scanf("%s",G.Scspot[i].data.name);
	}	
	else if(chose==3){
		printf("请直接输入修改后的景点后的景点简介:");
		scanf("%s",G.Scspot[i].data.Introduce); 
	}	
	else{
		printf("输入错误,请输入正确的选择.");
		ChangeSpeMes(i); 
	}
	printf("修改成功,修改后的景点信息为:\n");
	printf("------------------------------\n");
	printf("景点代号:%s\n",G.Scspot[i].data.number);
	printf("景点名称:%s\n",G.Scspot[i].data.name);
	printf("景点简介:%s\n",G.Scspot[i].data.Introduce); 
	printf("------------------------------\n");
	system("pause");
	system("cls");
}
/*修改景点信息*/
void  ChangeMes(){
	printf(">>请输入您要修改的景点的编号:");
	int chose;
	scanf("%d",&chose);
	ChangeSpeMes(chose);
}
/*查看校园平面图*/ 
void View(){
	printf("-------------------------------某高校校园平面图-------------------------------\n");
	printf(" **************************************************************************** \n");
    printf(" **                               <1>图书馆                                ** \n");
	printf(" **                                  |                                     ** \n");
	printf(" **       <2>体育馆 _________________|____________________ <8>科技园       ** \n");
	printf(" **                                  |                                     ** \n");
	printf(" **                                  |                                     ** \n");
	printf(" **       <3>北苑操场 ________ <4>南苑操场                                 ** \n");
	printf(" **         |                        |____________________ <9>北苑食堂     ** \n");
	printf(" **         |                        |                                     ** \n");
	printf(" **         |                   <5>湿地公园                                ** \n");
	printf(" **         |                        |                                     ** \n");
	printf(" **         |                        |____________________ <10>滴水涌泉    ** \n");
	printf(" **         |                        |                                     ** \n");
	printf(" **         |________________ <6>工业训练中心                              ** \n");
	printf(" **             ---->东              |                                     ** \n");
	printf(" **             |                    |____________________ <11>3号组团楼   ** \n");
	printf(" **             北                   |                                     ** \n");
	printf(" **                                <7>海豚湾                               ** \n");
	printf(" **************************************************************************** \n");
	printf(">>Enter键返回主界面继续进行选择\n");
	system("pause");
	system("cls");
}
/*查看景点信息*/ 
void ViewSpeMes(int i){
	printf("编号为%d的景点的信息为:\n",i);
	printf("---------------------------------------------\n");
	printf("景点代号:%s\n",G.Scspot[i].data.number);
	printf("景点名称:%s\n",G.Scspot[i].data.name);
	printf("景点简介:%s\n",G.Scspot[i].data.Introduce); 
	printf("---------------------------------------------\n");
}
/*查询景点信息*/ 
void ViewMes(){//保证输入合法 
	printf("请输入您要查看的景点信息的编号:");
	int chose;
	scanf("%d",&chose);
	ViewSpeMes(chose);
	printf("查询完毕!是否继续查询?(y/n)");
	char a;
	scanf(" %c",&a);
	if(a=='y'){
		printf("您选择了继续查询!\n");
		ViewMes();	
	}
	printf("查询结束,Enter键进入主界面\n");
	system("pause");
	system("cls");
}
/*求出任意两点之间的最短距离*/ 
void ShortestPath_Floyd(){
	for(int i=1;i<=12;i++){
		for(int j=1;j<=12;j++){
			D[i][j]=G.D[i][j];
			if(D[i][j]<inf&&i!=j) Path[i][j]=j;//两顶点有路,后继置为j 
			else Path[i][j]=-1; 
		} 
	}
	for(int k=1;k<=12;k++){
		for(int i=1;i<=12;i++){
			for(int j=1;j<=12;j++){
				if(D[i][k]+D[k][j]<D[i][j]){//存在更短的路径 
					D[i][j]=D[i][k]+D[k][j];//更新值
					Path[i][j]=Path[i][k];//更改i的后继为k 
				}	
			}
		}
	} 
}

/*打印路径的函数*/
void OutPath(int s,int e){
	int next=s;
	printf(">>路径为:\n");
	//printf("%s",G.Scspot[next].data.name);
	while(next!=e){
		printf("%s-->",G.Scspot[next].data.name);
		next=Path[next][e];//当前的后继点的编号 
	}
	printf("%s\n",G.Scspot[e].data.name);
} 
/*打印最短路径及最短距离*/
void PrintPath(){
	ShortestPath_Floyd();//预处理所有的最短路径
	printf("对照校园平面图,输入您当前所在景点及您要去的景点的编号:");
	int s,e;
	scanf("%d%d",&s,&e);
	if(s<=12&&s>=0&&e<=12&&e>=0){
		printf(">>%s到%s的最短路径长度为: %d\n",G.Scspot[s].data.name,G.Scspot[e].data.name,D[s][e]);
		OutPath(s,e); 
		printf(">>按Enter键返回主界面");
		system("pause");
		system("cls");	
	}else{
		printf("编号输入错误,请重新输入正确的景点编号!\n");
		printf("按Enter键重新输入");
		system("pause");
		system("cls");
		PrintPath(); 
	}
	
} 
void Menu(){ 
	printf("----------------欢迎进入校园导航系统----------------\n");
	printf("\n----------------------------------------------------\n");
	printf("1.查看校园平面图\n");
	printf("2.修改景点信息\n");
	printf("3.查看景点基本信息\n"); 
	printf("4.最短路径查询\n");
	printf("5.退出\n");
	printf("----------------------------------------------------\n");
	printf(">>请输入您要选择的功能:");
	int chose;
	scanf("%d",&chose);
	switch(chose){
		case 1: {
			View();
			Menu();
		}
		case 2: {
			ChangeMes();
			Menu();
		}
		case 3: {
			ViewMes();
			Menu();	
		} 
		case 4: {
			PrintPath();
			Menu();
		}
		case 5: {
			exit(0);
		} 
		default : {
			printf("您的选择有误,请重新选择!"); 
			Menu();
		}
	}	
} 

int main(){
	InitMes(); 
	printf("景点信息初始化成功,进入主界面\n");
	Menu();
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值