#include <stdio.h>
#define FALSE 0
#define TURE 1
int G[14][14]=
{
{32767,20,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767},
{20,32767,260,32767,32767,32767,32767,32767,40,32767,32767,32767,32767,32767},
{32767,260,32767,40,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767},
{32767,32767,40,32767,140,180,32767,32767,32767,32767,32767,32767,32767,32767},
{32767,32767,32767,140,32767,32767,32767,32767,32767,32767,32767,32767,100},
{32767,32767,32767,180,32767,32767,32767,32767,100,32767,32767,32767,32767,40},
{32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,80,140},
{32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,140,30,32767},
{32767,40,32767,32767,32767,100,32767,32767,32767,60,32767,32767,30,32767},
{32767,32767,32767,32767,32767,32767,32767,32767,60,32767,40,32767,32767,32767},
{32767,32767,32767,32767,32767,32767,32767,32767,32767,40,32767,80,32767,32767},
{32767,32767,32767,32767,32767,32767,32767,140,32767,32767,80,32767,32767,32767},
{32767,32767,32767,32767,32767,32767,80,30,30,32767,32767,32767,32767,32767},
{32767,32767,32767,32767,100,40,40,32767,32767,32767,32767,32767,32767,32767}
};
void map()
{
printf(" ⑿田径场━━━140━━━⑻第九实验楼 ┍⑸九栋宿舍楼━━━━┑/n");
printf(" ┃ ┃ ┃100 140┃/n");
printf(" ┃ 30 ┃ ┃ ┃/n");
printf(" 80 ⒀路口1━━━⑺超市━━ ⒁路口2 ┃/n");
printf(" ┃ 30 ┃ 80 40 ┃40 ┃/n");
printf(" ┃ ┃ ┃ ┃/n");
printf(" ⑾轮滑场━━⑽体育馆━━━⑼图书馆━━━━━⑹医院━━━━━━━⑷六栋/n");
printf(" 40 60 ┃ 100 180 ┃/n");
printf(" ┃ ┃/n");
printf(" 40 40┃/n");
printf(" ┃ ┃/n");
printf(" ┃ ┃/n");
printf(" ⑵第一教学楼━━━━━━━260 ━━━━⑶综合食堂/n");
printf(" ┃/n");
printf(" 20/n");
printf(" ┃/n");
printf(" ⑴大门口/n/n/n/n");
printf(" 1:大门口 2:第一教学楼 3:综合食堂 4:六栋 5:九栋 6:医院 7:超市 /n");
printf(" 8:第九实验楼 9:图书管 10:体育馆 11:轮滑场 12:田径场 13:路口1 14:路口2/n");
}
struct place
{
int ordernum;
char name[12];
}site[14]={{0,"大门口"},{1,"第一教学楼"},{2,"综合餐厅"},{3,"六栋"},{4,"九栋"},{5,"医院"},{6,"超市"},
{7,"第九实验楼"},{8,"图书馆"},{9,"体育馆"},{10,"轮滑场"},{11,"田径场"},{12,"路口1"},{13,"路口2"}
};
int shiyan[14];
void shortpath(int G[14][14],int v0,int p[14][14],int *D)
{
int vexnum=14;
int final[14];
int v,w;
int i,min,j;
shiyan[0]=v0;
for(v=0;v<vexnum;v++)
{
final[v]=FALSE;D[v]=G[v0][v];
for(w=0;w<vexnum;w++)
p[v][w]=FALSE;
if(D[v]<32767)
{
p[v][v0]=TURE;
p[v][v]=1;
}
}
D[v0]=0;final[v0]=TURE;
for(i=1;i<vexnum;i++)
{
min=32767;
for(w=0;w<vexnum;w++)
if(!final[w])
if(D[w]<min)
{
v=w;min=D[w];
}
final[v]=TURE;
shiyan[i]=v;
for(w=0;w<vexnum;w++)
if(!final[w]&&(min+G[v][w])<D[w])
{
D[w]=min+G[v][w];
for(j=0;j<14;j++)
p[w][j]=p[v][j];
p[w][w]=1;
}
}
}
int introduce(int a)
{
switch(a)
{
case 1 : printf("大门口:学校正门!/n");break;
case 2 : printf("第一教学楼:俗称“一教”,位于大门口对面!/n");break;
case 3 : printf("综合食堂:学校看起来最新的食堂,也是规模最大的食堂/n");break;
case 4 : printf("六栋:三大女生宿舍楼之一,聚集了学校大部分的女生!/n");break;
case 5 : printf("九栋:学校里N多的男生宿舍楼之一!/n");break;
case 6 : printf("医院:学生无论何时都不愿去的地方,看不好病也就算了,还不准时营业!/n");break;
case 7 : printf("超市:所有正常男生最痛恨的地方之一,处于两个路口之间!/n");break;
case 8 : printf("第九实验楼:基本上被称为机房的地方,除了上课时间,其余时间都是玩游戏的地方!/n");break;
case 9 : printf("/n");break;
case 10: printf("/n");break;
case 11 : printf("/n");break;
case 12 : printf("/n");break;
case 13 : printf("/n");break;
case 14 : printf("/n");break;
}
}
void choose1()
{
int p[14][14],D[14];
char sel;
int i,k; //均作为循环使用
int start,end; //起始地点和终止地点
printf("请依次输入起始和终止地点的编号<空格隔开>/n");
scanf("%d %d",&start,&end);
printf("是否需要景点介绍?<用“Y/N表示”>/n");
sel=getchar();
if(sel=='Y'||sel=='y')
{
introduce(start);
introduce(end);
}
else
{
start--;
end--;
}
shortpath(G,start,p,D);
printf("路径是:");
for(k=0;k<14;k++)
for(i=0;i<14;i++)
if(p[end][i]==1&&shiyan[k]==i)
printf("%s ",site[shiyan[k]].name);
printf("/n总路程长度是:%d ",D[end]);
printf("/n");
}
void main()
{
map();
choose1();
}
/*部分未完成*/