校园导游咨询(数据结构实践作业)

在这里插入图片描述在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<conio.h> 
#define INF 30
#define MINA 3
#define maxn 999
struct yh{
	char yhm[20];//用户名 字符型 
	char mm[20];//密码 字符型 
}gl[MINA];
struct jd{
	char jj[50];
	char mc[20];
	int dh;	
	int jl;	
}vi[INF][INF];
int n;//景点数量 
int v[INF];
int stack[INF];
int path[INF][INF];
int graph[INF][INF];
int count;//管理登录标记 
int x,y;  //查询景点的起始点于终点
int index1,index2; //最短路径查询的标记 
int top;  //标记 
void shanchu_jingdianlujing();//删除景点路径 
void tianjia_jingdianlujing();//添加景点路径
void zuiduanjingdian_chaxun();//最短路径名称查询 
void zuiduan_bianli();//最短路径的遍历 
void zhuan_huan();//景点代号和景点名称的转换 
void Dijkstra();//景点最短路径查询 
void Floyd();//弗洛伊德算法 
void jingdiansuoyoulujing();//景点所有路径查询  
void zuiduandaihao_chaxun();//最短路径代号查询 
void daihao_chaxun();//按照景点代号查询 
void jingdian_chaxun();//按照景点名称查询 
void map(); //景点地图  
void scanff();//数据录入 
void jingdianjieshao();//景点介绍
void guanlidenglu();//管理登录 
void tianjia_jingdian();//添加景点
void Floyd(){//弗洛伊德算法  记录最短路径和最短路径更新的中间路径 
	for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				path[i][j]=j;//初始化起点i到终点j的中间路径为j 
			}
		}
		for(int p=1;p<=n;p++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					if(graph[i][p]+graph[p][j]<graph[i][j]){
						graph[i][j]=graph[i][p]+graph[p][j];
						path[i][j]=path[i][p];//更新中间路径 
					}
				}
			}
		 }
	 } 
	void dfs(int b)//深度优先搜索 遍历所有路径 
{
	v[b]=1;//标记被访问过 
	stack[top++]= b;
	int i,j;
	for(i=1;i<=n;i++){
		if(vi[b][i].jl!=maxn){
			if(i==y){
				for(j=0;j<top;j++)
				   if(j==0)
				   printf("%d.%s",vi[0][stack[j]].dh,vi[0][stack[j]].mc);
				   else
				   printf("-->%d.%s",vi[0][stack[j]].dh,vi[0][stack[j]].mc);
				   printf("-->%d.%s\n",vi[0][y].dh,vi[0][y].mc);
				top--;
				v[b]=0;
				break;						
			}// 找到终点
			if(!v[i]){// 未被访问过 
				dfs(i);								
			}						 						
		}
		if(i==n) {// 如果该顶点无其它出度 
			top--;
			v[b]=0;	
		}
	}
}
	void zuiduan_bianli()
	{
		Floyd();	
	        printf("%s 到 %s 的最短距离为:%d m\n",vi[0][x].mc,vi[0][y].mc,graph[x][y]);//景点的代号和名称 
	        printf("%s 到 %s 的最短距离路线是:\n",vi[0][x].mc,vi[0][y].mc);	
	        printf("%d.%s-->",vi[0][x].dh,vi[0][x].mc);
	         while(path[x][y]!=y){	//从起点寻找到终点最短路径的中间路径并遍历 
		     printf("%d.%s-->",vi[0][path[x][y]].dh,vi[0][path[x][y]].mc);
		     x=path[x][y];		
	        }		 		
	       printf("%d.%s\n",vi[0][path[x][y]].dh,vi[0][path[x][y]].mc);	
	     scanff();// 
	 } 
	 void zhuan_huan(char a[],char b[]){//名称转化为代号 
		int flag1=0,flag2=0,l1=0,l2=0;
		for(int i=1;i<=n;i++){
			if(strcmp(a,vi[0][i].mc)==0)
			{
				flag1=1;
				l1=i;
			}
			if(strcmp(b,vi[0][i].mc)==0)
			{
				flag2=1;
				l2=i;
			} 
		}
		if(flag1==1&&flag2==1){
			x=l1; //x y 为全局变量  x为起点 y为终点 
			y=l2;
			if(index2==1)
			dfs(x);
			if(index1==1)
			zuiduan_bianli();
			index1=index2=0;
		}
		else{
			printf("输入景点名称错误!!!!!\n");
		}
	}
	void zuiduandaihao_chaxun(){//最短路径按照代号查询 
		 printf("请输入你想要查询的最短路径的两个编号\n");
		 scanf("%d %d",&x,&y);
		 zuiduan_bianli();
	} 
	void zuiduanjingdian_chaxun(){//最短路径按照名称查询 
		char name1[40],name2[40];
		printf("请输入你想要查询的两个景点的名称(两个景点用空格隔开,例如:健身馆  图书馆)\n");
		scanf("%s %s",name1,name2);
		index1=1;
		zhuan_huan(name1,name2);
		
	}
	void Dijkstra()//景点最短路径查询 
	{
		int t;
		printf("景点代号查询景点最短路径请按“1 ”\n"); 
	    printf("景点名称查询景点最短路径请按“2 ”\n");
	    scanf("%d",&t);
		switch(t){
	 	case 1: zuiduandaihao_chaxun();break;
	 	case 2: zuiduanjingdian_chaxun();break;
	 	} 
	} 
	void daihao_chaxun()
	{
		  printf("请输入你想要查询的两个景点的代号\n");
		  scanf("%d %d",&x,&y);
		  dfs(x);	 
	}
	void jingdian_chaxun()
	{
		char name1[40],name2[40];
		printf("请输入你想要查询的两个景点的名称(两个景点用空格隔开,例如:健身馆  图书馆)\n");
		scanf("%s %s",name1,name2);
		index2=1;
		zhuan_huan(name1,name2);
		
	}
    void jingdiansuoyoulujing ()//景点所有路径查询 
	{
		int t;
		printf("景点代号查询景点所有路径请按“1 ”\n"); 
	    printf("景点名称查询景点所有路径请按“2 ”\n");
	    scanf("%d",&t);
		switch(t){
	 	case 1: daihao_chaxun();break;
	 	case 2: jingdian_chaxun();break;
	 }	  
	} 

void tianjia_jingdianlujing()//添加路径 
{
	int t,i,j,p; 
	printf("请输入你想添加的路径的数量\n");
	scanf("%d",&t);
	while(t--){
		printf("请输入你想添加路径的两个景点的代号和路径长度(例如 1 2 8)\n");
		scanf("%d %d %d",&i,&j,&p);
		if(vi[i][j].jl!=maxn||vi[j][i].jl!=maxn){
			printf("景点已存在路径\n");
			printf("添加路径失败!!!!\n");
		}
		else{
		vi[i][j].jl=p,vi[j][i].jl=p;
		graph[i][j]=p,graph[j][i]=p;
		printf("景点路径添加成功\n");
		}
	} 	
}
void shanchu_jingdianlujing()//删除路径 
{
	printf("请输入你想删除景点路径的数量\n");
	int t,dh1,dh2;
	scanf("%d",&t);
	while(t--){
		printf("请输入你想删除两个景点间路径的代号(例如:1 3)\n");
		scanf("%d %d",&dh1,&dh2);
		if(vi[dh1][dh2].jl==maxn||vi[dh2][dh1].jl==maxn)
		{
			printf("你想删除的景点路径不存在\n");
			printf("删除失败!!!!\n"); 
		}
		else{
			vi[dh1][dh2].jl=maxn,vi[dh2][dh1].jl=maxn;	
			graph[dh1][dh2]=maxn,graph[dh2][dh1]=maxn;
			printf("删除路径成功\n");
		}
	} 
}
void scanff()//数据录入 
	{
		for(int i=1;i<=16;i++){//景点距离初始化 
		  for(int j=1;j<=16;j++){
			vi[i][j].jl=maxn;
			graph[i][j]=maxn;
			}
		}
		vi[0][1].dh=1;
		strcpy(vi[0][1].mc,"艺术楼");
		strcpy(vi[0][1].jj,"是大学生课外学习的地方");
		vi[0][2].dh=2;
		strcpy(vi[0][2].mc,"健身房");
		strcpy(vi[0][2].jj,"是大学生课外锻炼的地方");
		vi[0][3].dh=3;
		strcpy(vi[0][3].mc,"公寓");
		strcpy(vi[0][3].jj,"是大学生休息的地方");
		vi[0][4].dh=4;
		strcpy(vi[0][4].mc,"北门");
		strcpy(vi[0][4].jj,"是进入学校北区的正门");
		vi[0][5].dh=5;
		strcpy(vi[0][5].mc,"北餐厅");
		strcpy(vi[0][5].jj,"是北苑学生的吃饭的地方");
		vi[0][6].dh=6;
		strcpy(vi[0][6].mc,"特别行政楼");
		strcpy(vi[0][6].jj,"是学校老师休息的地方");
		vi[0][7].dh=7;
		strcpy(vi[0][7].mc,"校医院");
		strcpy(vi[0][7].jj,"是学生日常看病的地方");
		vi[0][8].dh=8;
		strcpy(vi[0][8].mc,"西门");
		strcpy(vi[0][8].jj,"是进入学校西区的正门");
		vi[0][9].dh=9;
		strcpy(vi[0][9].mc,"多媒体教学楼");
		strcpy(vi[0][9].jj,"是一栋多媒体总控制教学楼");
		vi[0][10].dh=10;
		strcpy(vi[0][10].mc,"运动场");
		strcpy(vi[0][10].jj,"是大学生锻炼身体的地方");
		vi[0][11].dh=11;
		strcpy(vi[0][11].mc,"游泳馆");
		strcpy(vi[0][11].jj,"是大学生日常游泳的地方");
		vi[0][12].dh=12;
		strcpy(vi[0][12].mc,"南餐厅");
		strcpy(vi[0][12].jj,"是南苑学生的吃饭的地方");
		vi[0][13].dh=13;
		strcpy(vi[0][13].mc,"一号,二号,三号教学楼");
		strcpy(vi[0][13].jj,"是大学生的日常学习的地方");
		vi[0][14].dh=14;
		strcpy(vi[0][14].mc,"图书馆");
		strcpy(vi[0][14].jj,"是大学生丰富知识的海洋");
		vi[0][15].dh=15;
		strcpy(vi[0][15].mc,"办公室");
		strcpy(vi[0][15].jj,"是学校老师日常办公的地方");
		vi[0][16].dh=16;
		strcpy(vi[0][16].mc,"学校正门");
		strcpy(vi[0][16].jj,"是进入校园的正门");
		vi[1][2].jl=4,vi[2][1].jl=4;
		vi[2][4].jl=8,vi[4][2].jl=8;
		vi[1][6].jl=12,vi[6][1].jl=12;
		vi[2][5].jl=9,vi[5][2].jl=9;
		vi[4][9].jl=15,vi[9][4].jl=15;
		vi[6][3].jl=10,vi[3][6].jl=10;
		vi[3][5].jl=6,vi[5][3].jl=6;
		vi[5][7].jl=2,vi[7][5].jl=2;
		vi[7][14].jl=5,vi[14][7].jl=5;
		vi[9][14].jl=5,vi[14][9].jl=5;
		vi[6][8].jl=20,vi[8][6].jl=20;
		vi[3][8].jl=5,vi[8][3].jl=5;
		vi[8][11].jl=11,vi[11][8].jl=11;
		vi[5][11].jl=7,vi[11][5].jl=7;
		vi[11][12].jl=3,vi[12][11].jl=3;
		vi[7][12].jl=1,vi[12][7].jl=1;
		vi[12][14].jl=3,vi[14][12].jl=3;
		vi[8][15].jl=8,vi[15][8].jl=8;
		vi[11][13].jl=8,vi[13][11].jl=8;
		vi[12][16].jl=8,vi[16][12].jl=8;
		vi[13][15].jl=12,vi[15][13].jl=12;
		vi[13][16].jl=9,vi[16][13].jl=9;
		vi[8][10].jl=4,vi[10][8].jl=4;
		vi[11][10].jl=3,vi[10][11].jl=3;
		vi[10][5].jl=5,vi[5][10].jl=5;
		graph[1][2]=4,graph[2][1]=4;
		graph[2][4]=8,graph[4][2]=8;
		graph[1][6]=12,graph[6][1]=12;
		graph[2][5]=9,graph[5][2]=9;
		graph[4][9]=15,graph[9][4]=15;
		graph[6][3]=10,graph[3][6]=10;
		graph[3][5]=6,graph[5][3]=6;
		graph[5][7]=2,graph[7][5]=2;
		graph[7][14]=5,graph[14][7]=5;
		graph[9][14]=5,graph[14][9]=5;
		graph[6][8]=20,graph[8][6]=20;
		graph[3][8]=5,graph[8][3]=5;
		graph[8][11]=11,graph[11][8]=11;
		graph[5][11]=7,graph[11][5]=7;
		graph[11][12]=3,graph[12][11]=3;
		graph[7][12]=1,graph[12][7]=1;
		graph[12][14]=3,graph[14][12]=3;
		graph[8][15]=8,graph[15][8]=8;
		graph[11][13]=8,graph[13][11]=8;
		graph[12][16]=8,graph[16][12]=8;
		graph[13][15]=12,graph[15][13]=12;
		graph[13][16]=9,graph[16][13]=9;
		graph[8][10]=4,graph[10][8]=4;
		graph[11][10]=3,graph[10][11]=3;
		graph[10][5]=5,graph[5][10]=5;
		n=16;
	}
	void map()//景点地图查询
{ 
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("┃┏━━━━━━━━┓┏━━━━━┓                      ┏━━━━━━━┓  ┃\n");
	printf("┃┃   艺术楼       ┃┃   健身房 ┃                ━━━┫       北门   ┣━┃\n");
	printf("┃┗━━━━━━━━┛┗━━━━━┛                      ┗━━━━━━━┛  ┃\n");
	printf("┃                                                                            ┃\n");
	printf("┃                  ┏━━━━━┓                                           ┃\n");
	printf("┃                  ┃          ┃  ┏━━━━┓                              ┃\n");
	printf("┃                  ┃ 学生公寓 ┃  ┃北餐厅  ┃                              ┃\n");
	printf("┃                  ┗━━━━━┛  ┗━━━━┛                              ┃\n");
	printf("┃┏━━━━━━━━━━━━━━┓  ┏━━━━┓                              ┃\n");
	printf("┃┃       特别行政楼           ┃ ┃  校医院┃       ┏━━━━━━┓   ┃\n");
	printf("┃┗━━━━━━━━━━━━━━┛ ┗━━━━┛          ┃            ┃   ┃\n");
	printf("┃┏━━━━┓                                   ┃  多媒体    ┃   ┃\n");
	printf("┃┃   西门 ┃                                      ┃  教学楼    ┃   ┃\n");
	printf("┃┗━━━━┛                                             ┃            ┃   ┃\n");
	printf("┃ ┏━━━━━━━━━┓           ┏━━━━━━┓       ┗━━━━━━┛   ┃\n");
	printf("┃ ┃                  ┃           ┃  游泳馆    ┃                          ┃\n");
	printf("┃ ┃                  ┃           ┃            ┃                          ┃\n");
	printf("┃ ┃       运         ┃           ┗━━━━━━┛                          ┃\n");
	printf("┃ ┃                  ┃                                                     ┃\n");
	printf("┃ ┃       动         ┃           ┏━━━━┓                              ┃\n");
	printf("┃ ┃                  ┃           ┃        ┃                              ┃\n");
	printf("┃ ┃       场         ┃           ┃ 南餐厅 ┃                              ┃\n");
	printf("┃ ┃                  ┃           ┗━━━━┛   ┏━━━━━━┓           ┃\n");
	printf("┃ ┃                  ┃                          ┃     图     ┃           ┃\n");
	printf("┃ ┃                  ┃          ┏━━━━━┓  ┃     书     ┃           ┃\n");
	printf("┃ ┃                  ┃          ┃一号教学楼┃  ┃     馆     ┃           ┃\n");
	printf("┃ ┗━━━━━━━━━┛          ┃━━━━━┃  ┗━━━━━━┛           ┃\n");
	printf("┃                                 ┃二号教学楼┃                             ┃\n");
	printf("┃                                 ┃━━━━━┃                             ┃\n");
	printf("┃                                 ┃三号教学楼┃                             ┃\n");
	printf("┃                                 ┗━━━━━┛                             ┃\n");
	printf("┃                                                                            ┃\n");
	printf("┃         ┏━━━━━━━━━┓                   ┏━━━━━┓            ┃\n");
	printf("┃         ┃      办 公 楼    ┃     ━━━━━━━┫学校正门  ┣━━━━━━┃\n");
	printf("┃         ┗━━━━━━━━━┛                   ┗━━━━━┛            ┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
    printf("\n");
	} 
	void bianli()//所有景点便遍历 
	{
		for(int i=1;i<=n;i++){
		 printf("%d %s %s\n",vi[0][i].dh,vi[0][i].mc,vi[0][i].jj);	
		} 
	}
	void bufenbianli()//部分景点遍历 
	{
		int t;
	     printf("请输入你所查询景点的代号(1~n)\n");
	   	scanf("%d",&t);
	   	printf("%d %s %s\n",vi[0][t].dh,vi[0][t].mc,vi[0][t].jj);
	
	} 
	void jingdianjieshao()//景点介绍
	{
	 int t; 
	printf("查询全部景点请按“1 ”\n"); 
	printf("查询部分景点请按“2 ”\n");
	 scanf("%d",&t);
	 switch(t){
	 	case 1: bianli();break;
	 	case 2: bufenbianli();break;
	 }
	}
  void guanlidenglu(){	//管理登陆 
	FILE *fp;
	if((fp=fopen("用户文档.txt","w+"))==NULL)
	{
		printf("程序出错!\n");
		exit(0);
	}
	strcpy(gl[0].yhm,"张三");//登录账号 
	strcpy(gl[1].yhm,"李四");
	strcpy(gl[2].yhm,"王二");
	strcpy(gl[0].mm,"88888888");//登录密码 
	strcpy(gl[1].mm,"88888888");
	strcpy(gl[2].mm,"88888888");
	for(int i=0;i<3;i++){
	fprintf(fp,"%s %s\n",gl[i].yhm,gl[i].mm);//保存到文件 
	}
	if(fclose(fp)){
		printf("程序出错!\n");
		exit(0);
	}
	system("cls");//清屏 
	FILE *fp1;
	char yhm[40],mm[20],x1[40],m;
	int check=0;
	printf("请输入用户名并按下回车键后输入密码\n");
	scanf("%s",yhm);
	printf("请输入密码(6~16位)\n");
	int e=0;
	while((m=getch())!='\r'){
		if(m=='\b'){
			printf("\b \b");
			e=e-1;
			mm[e]='\0';
		}
		else{
			mm[e++]=m;
			printf("*");
		} 
	}
	mm[e]='\0';
	while(e<6||e>16){
		printf("\n您输入的密码不合法!\n请重新输入密码(6~16位)\n");
		e=0;
	    while((m=getch())!='\r'){
		if(m=='\b'){
			printf("\b \b");
			e=e-1;
			mm[e]='\0';
		}
		else{
			mm[e++]=m;
			printf("*");
		} 
	    }
	    mm[e]='\0';
	} 
	strcat(yhm," ");strcat(yhm,mm);strcat(yhm,"\n");
	if((fp1=fopen("用户文档.txt","r"))==NULL){
		printf("程序出错!\n");
		exit(0);
	}
	while(!feof(fp1)){
		fgets(x1,40,fp1);
		if(strcmp(yhm,x1)==0){
			check=1;break;
		}
	}
	if(fclose(fp1)){
		printf("系统出错!\n");
		exit(0);
	}
	int i1,i=1;
	if(check==0){
		for(i1=1;i1<=3;i1++){
			printf("\n用户名或密码错误!(您还有%d次机会)\n",3-i1);
				printf("请重新输入用户名\n");
			scanf("%s",yhm);
			printf("请输入密码(6~16位)\n");
			int e=0;
	        while((m=getch())!='\r'){
		    if(m=='\b'){
			printf("\b \b");
			e=e-1;
			mm[e]='\0';
		    }
		    else{
			mm[e++]=m;
			printf("*");
		    } 
	        }
	        mm[e]='\0';
	    while(e<6||e>16){
		printf("\n您输入的密码不合法!\n请重新输入密码(6~16位)\n");
		e=0;
	    while((m=getch())!='\r'){
		if(m=='\b'){
			printf("\b \b");
			e=e-1;
			mm[e]='\0';
		}
		else{
			mm[e++]=m;
			printf("*");
		} 
	    }
	    mm[e]='\0';
	    }
	    strcat(yhm," ");strcat(yhm,mm);strcat(yhm,"\n");
	    if((fp1=fopen("用户文档.txt","r"))==NULL){
		printf("程序出错!\n");
		exit(0);
	}
	while(!feof(fp1)){
		fgets(x1,40,fp1);
		if(strcmp(yhm,x1)==0){
			check=1;break;
		}
	}
	if(fclose(fp1)){
		printf("系统出错!\n");
		exit(0);
	}
	    if(check==1)
	    break;
	    else
	    	i++;
	    if(check==0&&i==3){
	    	printf("\n您已输错三次!\n强制退出");
	    	break;
		}
		}
	} 
	if(check==1){
		system("cls");//清屏 
		printf("\n管理登录成功\n");
		int k;
		while(1){
		printf("1.添加景点请按“1”键;\n");
		printf("2.添加景点间路径请按“2”键;\n");
		printf("3.删除景点间路径请按“3”键;\n");
		printf("4.退出管理系统请按“4”键;\n"); 
		scanf("%d",&k);
		switch(k)
		 {
		 case 1:tianjia_jingdian();break; 
		 case 2:tianjia_jingdianlujing();break;
		 case 3:shanchu_jingdianlujing();break;
		 case 4:count=1;break;
		 }
		if(count==1)
		  break;
		}
	}
 } 
 	void tianjia_jingdian()//添加景点 
{
	int dh,t,sum=0;
	int i=n,j=n,p=n,w;
	char name[20],jj[50];
	printf("请输入你想添加的景点数量\n");
	scanf("%d",&t);
	getchar();//吸收换行 
	while(t--){
		sum=0;
		printf("请依次输入景点的名称 简介(中间用空格隔开并且都不可以为空---景点代号自编 )\n");
		scanf("%s %s",name,jj);
		for(w=1;w<=n;w++){
			if(strcmp(name,vi[0][w].mc)==0||strcmp(jj,vi[0][w].jj)==0){
				printf("你输入的景点或景点简介已存在\n");
				printf("添加景点失败!!!!\n");
				sum=1;
				break;
			}	
		}
		if(sum==0){
		strcpy(vi[0][++i].mc,name);
		strcpy(vi[0][++j].jj,jj);
		vi[0][++p].dh=++n;
		//添加景点的路径初始化
		for(int i=1;i<=n;i++){
			vi[i][n].jl=maxn,vi[n][i].jl=maxn;
			graph[i][n]=maxn,graph[n][i]=maxn;
		} 
	    printf("景点添加成功\n");
		}
	} 
}
	
int main ()
{
	printf("********************************************************************************\n");
	printf("*                                                                              *\n");
	printf("*                                                                              *\n");
	printf("*                   欢迎使用安阳师范学院老校区导游系统 !                       *\n");
	printf("*                                                                              *\n");
	printf("*                                                                              *\n");
	printf("********************************************************************************\n");
    printf("\n");
    scanff();
    system("color 3B"); //改色	
	int k; 
    while(1)
    {   
		printf("1.景点信息查询请按“1”键;\n");
		printf("2.景点最短路径查询请按“2”键;\n");
		printf("3.景点所有路径查询请按“3”键;\n");
		printf("4.校内景点地图查询请按“4”键;\n");	    
		printf("5.退出系统请按“5”键;\n");
		printf("6.管理登录请按“6”键;\n");
		printf("请选择: \n");
		scanf("%d",&k);
		switch(k)
		{
		case 1:printf("景点介绍查询。\n");jingdianjieshao();break; 
		case 2:printf("景点最短路径查询。\n");Dijkstra();break;
	    case 3:printf("景点所有路径查询。\n");jingdiansuoyoulujing();break;
		case 4:printf("景点地图。\n");map();break;
		case 5:printf("谢谢使用!\n");exit(0);
		case 6:guanlidenglu();break;
		}
    }
    system("pause");
	return 0;
}
发布了57 篇原创文章 · 获赞 69 · 访问量 6376

猜你喜欢

转载自blog.csdn.net/zp1455604302/article/details/94155106