/*
功能:给出一张某公园的导游图,游客通过终端询问可知:
从某一景点到另一景点的最短路径。游客从公园大门进入,选一条最佳路线,使游客可以不重复地游览各景点,最后回到出口(出口就在入口旁边)。
分步实施:
1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
2. 完成最低要求:建立一个文件,包括5个景点情况,能完成遍历功能;
3. 进一步要求:进一步扩充景点数目,画出景点图,有兴趣的同学可以自己扩充系统功能。
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MaxVertexNum 100
#define MaxCost 9999
typedef char VertexType;
typedef int EdgeType;
typedef struct
{ VertexType vexs[MaxVertexNum];
/* 存放顶点信息 */
EdgeType edges[MaxVertexNum][MaxVertexNum];
/* 存放邻接关系 */
int n,e; /*顶点数和边数*/
}Mgraph;
void mune(); //主菜单界面
void floyd(Mgraph G,int D[MaxVertexNum][MaxVertexNum],int P[MaxVertexNum][MaxVertexNum]); //指定距离的弗洛伊德
void opfloy(int n,int D[MaxVertexNum][MaxVertexNum],int P[MaxVertexNum][MaxVertexNum]); //指定距离的输出
void hamanzi(Mgraph *G); //从起点开始遍历的函数。
void CreateMGraph(Mgraph *G); //建立图的函数
void printph();
void look();
int main()
{
Mgraph G;
int n,D[MaxVertexNum][MaxVertexNum],P[MaxVertexNum][MaxVertexNum];
int a;
char b[100];
char user[20],mana[20]=”chenjian”,*q,*p,m=0;//依次是登录者,管理者,指针来判断登录账号是否是管理者。
system(“color f0”);
L: printf(“\t ***************************************************\n”);
printf(“\t请登录(输入你的用户名):”);
scanf(“%s”,user);
p=user;
q=mana;
while(*p==*q)//用来判断登陆者是否为管理者的部分
{
m=1;
p++;
q++;
if(*q==’\0′)
break;
}
if(*p!=*q)
m=0;
/******************************************************************/
if(m==1)
{
printf(“”);
CreateMGraph(&G);
system(“cls”);
L1: mune();
printf(“请输入您的选项\n”);
scanf(“%d”,&a);
switch(a)
{
case 1:
floyd(G,D,P);
opfloy(G.n,D,P);
system(“pause”);
system(“cls”);
a=35421568;
goto L1;
case 2:
hamanzi(&G);
system(“pause”);
system(“cls”);
a=35421568;
goto L1;
case 3:
printph();
system(“pause”);
system(“cls”);
a=35421568;
goto L1;
case 4:
look();
system(“cls”);
a=35421568;
goto L1;
case 0:
break;
default:
printf(“您输入有误,请重新输入!!!\n”);
system(“pause”);
gets(b);
a=35421568;
system(“cls”);
goto L1;
}
}
else
{
//CreateMGraph(&G);
system(“cls”);
L3:
printf(“\t\t\t您不是管理者无法对景点信息进行修改.”);
printf(“**********************************************************************************\n”);
printf(“\t\t\t——–公园导游系统——-\n”);
printf(“\t\t\t 1:去指定的景点\n”);
printf(“\t\t\t 2:遍历全部景点\n”);
printf(“\t\t\t 3:查看公园的全图\n”);
printf(“\t\t\t 4:查看景点介绍\n”);
printf(“\t\t\t 5:返回登陆界面\n”);
printf(“\t\t\t 0:退出\n”);
printf(“**********************************************************************************\n”);
printf(“请输入您的选项\n”);
scanf(“%d”,&a);
switch(a)
{
case 1:
floyd(G,D,P);
opfloy(G.n,D,P);
system(“pause”);
system(“cls”);
a=35421568;
goto L3;
case 2:
hamanzi(&G);
system(“pause”);
system(“cls”);
a=35421568;
goto L3;
case 3:
printph();
system(“pause”);
system(“cls”);
a=35421568;
goto L3;
case 4:
look();
system(“cls”);
a=35421568;
goto L3;
case 5:
a=35421568;
system(“cls”);
goto L;
case 0:
break;
default:
printf(“您输入有误,请重新输入!!!\n”);
system(“pause”);
gets(b);
a=35421568;
system(“cls”);
goto L3;
}
}
return 0;
}
void mune()
{
printf(“**********************************************************************************\n”);
printf(“\t\t\t——–公园导游系统——-\n”);
printf(“\t\t\t 1:去指定的景点\n”);
printf(“\t\t\t 2:遍历全部景点\n”);
printf(“\t\t\t 3:查看公园的全图\n”);
printf(“\t\t\t 4:查看景点介绍\n”);
printf(“\t\t\t 0:退出\n”);
printf(“**********************************************************************************\n”);
}
void floyd(Mgraph G,int D[MaxVertexNum][MaxVertexNum],int P[MaxVertexNum][MaxVertexNum])
{ int i,j,k;
for(i=0;i<G.n;i++)
for(j=0;j<G.n;j++)
{D[i][j]=G.edges[i][j];
if ((D[i][j]<MaxCost)&&(D[i][j]!=0))
P[i][j]=j;
else
P[i][j]=-1;
}
for(i=0;i<G.n;i++)
D[i][i]=0;
for(k=0;k<G.n;k++)
for(i=0;i<G.n;i++)
for(j=0;j<G.n;j++)
if (D[i][j]>D[i][k]+D[k][j])
{D[i][j]=D[i][k]+D[k][j];
P[i][j]=P[i][k]; /* i到j的路径上i的后继顶点改为i到k路径上i的后继顶点 */
}
}
void opfloy(int n,int D[MaxVertexNum][MaxVertexNum],int P[MaxVertexNum][MaxVertexNum])
{int i,j,k,c,m,p,min,next;
printf(“请输入您现在的位置和将去的位置如(m,p)\n”);
scanf(“%d,%d”,&m,&p);
i=m;
j=p;
// for (i=0;i<n;i++)
// printf(“\n\n源点为v%d:”,i);
// for (j=0;j<n;j++)
if (j!=i)
{printf(“\n%d到%d应按如下行走 , 最近距离为:\n”,i,j);
printf(“%d”,i);
next=P[i][j];
while (next!=-1)
{printf(“->%d”,next);
next=P[next][j]; }
if (D[i][j]==MaxCost)
printf(“->%d”,j);
printf(“\t%d”,D[i][j]); }
}
void hamanzi(Mgraph *G)
{
int i,j,m,wei[5],sum=0,min=100,end[5],zui[6];
int q,w,t,r;
for(i=1;i<5;i++)
{
end[i]=0;
}
printf(“请输入你的起点。\n”);
scanf(“%d”,&m);
for(q=0;q<5;q++)
{
end[m]=1;
end[q]=1;
for(w=0;w<5;w++)
{
end[w]=1;
for(t=0;t<5;t++)
{
end[t]=1;
for(r=0;r<5;r++)
{
end[r]=1;
sum=G->edges[m][q]+G->edges[q][w]+G->edges[w][t]+G->edges[t][r]+G->edges[r][m];
end[m]=1;
end[q]=1;
end[w]=1;
end[t]=1;
end[r]=1;
if(min>sum&&end[0]==1)
{
if(end[1]==1&&end[2]==1)
{
if(end[3]==1&&end[4]==1)
{
min=sum;
zui[1]=q;
zui[2]=w;
zui[3]=t;
zui[4]=r;
zui[5]=m;
}
}
}
sum=200;
end[r]=0;
}
end[t]=0;
}
end[w]=0;
}
end[q]=0;
}
printf(“最小为:%d\n”,min);
printf(“应按照如下浏览:\n”);
printf(“%d”,m);
for(i=1;i<6;i++)
{
printf(“->%d”,zui[i]);
}
}
void CreateMGraph(Mgraph *G)
{int i,j,k,w;
printf(“请输入顶点数和边数(输入格式为:顶点数,边数):\n”) ;
scanf(“%d,%d”,&(G->n),&(G->e));
printf(“请输入顶点信息:\n”);
for(i=0;i<G->n;i++)
scanf(“\n%c”,&(G->vexs[i]));
for(i=0;i<G->n;i++)
for(j=0;j<G->n;j++)
G->edges[i][j]=MaxCost;
printf(“请输入每条边对应的两个顶点的序号(输入格式为:i,j,w):\n”);
for(k=0;k<G->e;k++)
{ scanf(“%d,%d,%d”,&i,&j,&w);
G->edges[i][j]=w; }
}
void printph()
{
printf(“公园地图为:\n”);
printf(“\t\t\t\t0* * * * * * 1\n”);
printf(“\t\t\t\t** **\n”);
printf(“\t\t\t\t* * * *\n”);
printf(“\t\t\t\t* * * *\n”);
printf(“\t\t\t\t* * * *\n”);
printf(“\t\t\t\t* * * *\n”);
printf(“\t\t\t\t* 2 *\n”);
printf(“\t\t\t\t* * *\n”);
printf(“\t\t\t\t* * *\n”);
printf(“\t\t\t\t* * *\n”);
printf(“\t\t\t\t* * *\n”);
printf(“\t\t\t\t* * *\n”);
printf(“\t\t\t\t4* * * * * * 3\n”);
}
void look()
{
int a;
char b[100];
system(“cls”);
L2:
printf(“\t\t\t 1:曲江池\n”);
printf(“\t\t\t 2:大唐芙蓉园\n”);
printf(“\t\t\t 3:陕西省博物馆\n”);
printf(“\t\t\t 4:西安理工大学喷泉\n”);
printf(“\t\t\t 5:法门寺\n”);
printf(“\t\t\t 0:退回主界面\n”);
printf(“请输入您的选择。\n”);
scanf(“%d”,&a);
switch(a)
{
case 1:
printf(“曲江池遗址公园,北接大唐芙蓉园,南至秦二世陵遗址,占地面积1500亩。从唐曲江池遗址、\n秦二世皇帝墓等文物古迹的保护性开发、城市功能配套和区域生态环境建设的角度出发,\n依托周边丰富的旅游文化资源和人文传统,恢复性再造曲江南湖、曲江流饮、\n汉武泉、宜春苑、凤凰池等历史文化景观,再现曲江地区“青林重复,\n绿水弥漫”的山水人文格局,构建集生态环境重建、观光休闲娱乐、现代商务会展等功能\n为一体的综合性城市生态和娱乐休闲区。\n”);
system(“pause”);
system(“cls”);
a=65944899;
goto L2;
case 2:
printf(“西安大唐芙蓉园是国家AAAAA级旅游景区,全国首个全方位展示盛唐风貌的大型皇家园林式文化主\n题公园,是首个五感(即视觉、听觉、嗅觉、触觉、味觉)主题公园,拥有全球最大户\n外香化工程以及全球最大的水景表演展示。\n”);
system(“pause”);
system(“cls”);
a=65944899;
goto L2;
case 3:
printf(“陕西历史博物馆位于西安大雁塔的西北侧,筹建于1983年,1991 年6月20日落成开放,是它的建成\n标志着中国博物馆事业迈入了新的发展里程。这座馆舍为中央殿堂、四隅崇楼的唐风\n建筑群,主次井然有序,高低错落有致,气势雄浑庄重,融民族传统、地方特色\n和时代精神于一体。\n”);
system(“pause”);
system(“cls”);
a=65944899;
goto L2;
case 4:
printf(“西安理工大学(Xi’an University of Technology)简称“西理工”,坐落于古都西安,是国家“中西\n部高校基础能力建设工程”重点建设大学\n”);
system(“pause”);
system(“cls”);
a=65944899;
goto L2;
case 5:
printf(“法门寺,又称法云寺,位于中国陕西省宝鸡市扶风县法门镇,有“关中塔庙始祖之称”。\n”);
system(“pause”);
system(“cls”);
a=65944899;
goto L2;
case 0:
break;
default:
printf(“您的输入有误!!!”);
system(“pause”);
gets(b);
system(“cls”);
a=65944899;
goto L2;
}
}