

#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;
}
}
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;
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("* 欢迎XXXX学校XXXX学院导游系统 ! *\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;
}