1.从景石出发,步行游览以下景点:①游客服务中心,②阳光草坪,③森林小剧场,④儿童科普体验区,⑤儿童戏水场,⑥湿地博物馆,⑦湿地商业街。建立数学模型,找出从景石出发,到达⑦湿地商业街,并且经过①—⑥所有景点至少1次的距离最短的路线,计算该路线的长度。注:在每个景点不用停留。
任意两个景点之间的最短步行距离如表1给出。
0~7 分别表示景石、游客服务中心、阳光草坪、森林小剧场、儿童科普体验区、儿童戏水场、湿地博物馆、湿地商业街。
假定每个景点只经过一次,起点为景石,终点为湿地商业街,所以路线一共有6!=720条。
算法思想:
(1)按顺序找到一条路径leng并记录在min,min=leng。
(2)接着找下一条路径leng,这条路径leng与路径min比较。如果leng<=min,则把leng记录在min,min=leng,否则什么也不做。
(3)重复(2),直到把所有的路径都找出来,最后的min一定是最短的路径。
最短的路径为:0->3->5->1->2->4->6->7
最短路径的长度为:1820
public class LinkList {
public static void main(String[] args) {
int leng=0; //总路程
int min=10000; //最短路程,初始化为10000
//把景点之间的最短步行距离赋值到a[][]
int [][] a=new int[8][8];
a[0][0]=0 ;a[0][1]=300;a[0][2]=360;a[0][3]=210;a[0][4]=590;a[0][5]=475;a[0][6]=500;a[0][7]=690; //a[0][1]表示景石到游客服务中心的距离为300,之后的亦然
a[1][0]=300;a[1][1]=0 ;a[1][2]=380;a[1][3]=270;a[1][4]=230;a[1][5]=285;a[1][6]=200;a[1][7]=390;
a[2][0]=360;a[2][1]=380;a[2][2]=0 ;a[2][3]=510;a[2][4]=230;a[2][5]=765;a[2][6]=580;a[2][7]=770;
a[3][0]=210;a[3][1]=270;a[3][2]=510;a[3][3]=0 ;a[3][4]=470;a[3][5]=265;a[3][6]=450;a[3][7]=640;
a[4][0]=590;a[4][1]=230;a[4][2]=230;a[4][3]=470;a[4][4]=0 ;a[4][5]=515;a[4][6]=260;a[4][7]=450;
a[5][0]=475;a[5][1]=285;a[5][2]=765;a[5][3]=265;a[5][4]=515;a[5][5]=0 ;a[5][6]=460;a[5][7]=650;
a[6][0]=500;a[6][1]=200;a[6][2]=580;a[6][3]=450;a[6][4]=260;a[6][5]=460;a[6][6]=0 ;a[6][7]=190;
a[7][0]=690;a[7][1]=390;a[7][2]=760;a[7][3]=640;a[7][4]=450;a[7][5]=650;a[7][6]=190;a[7][7]=0 ;
int i1=0; //起点为景石
int i8=7; //终点为湿地商业街
int [] b=new int[8]; //记录景点,1为未游览,0为已游览
b[0]=0; //起点终点都已确定,所以先置为0
b[7]=0;
for(int i=1;i<7;i++)
b[i]=1;
int [] c=new int[8]; //用来记录路径
for(int i2=1;i2<7;i2++)
{
if(b[i2]==0) //如果已走过,就不能再走了
continue; //
b[i2]=0;
leng=leng+a[i1][i2]; //把走过的路的路程加起来
for(int i3=1;i3<7;i3++)
{
if(b[i3]==0)
continue;
b[i3]=0;
leng=leng+a[i2][i3];
for(int i4=1;i4<7;i4++)
{
if(b[i4]==0)
continue;
b[i4]=0;
leng=leng+a[i3][i4];
for(int i5=1;i5<7;i5++)
{
if(b[i5]==0)
continue;
b[i5]=0;
leng=leng+a[i4][i5];
for(int i6=1;i6<7;i6++)
{
if(b[i6]==0)
continue;
b[i6]=0;
leng=leng+a[i5][i6];
for(int i7=1;i7<7;i7++)
{
if(b[i7]==0)
continue;
b[i7]=0;
leng=leng+a[i6][i7];
leng=leng+a[i7][i8];
if(leng<=min) //如果存在更短的路径,就把更短的那条路径记录下来
{
min=leng;
c[0]=i1;c[1]=i2;c[2]=i3;c[3]=i4;c[4]=i5;c[5]=i6;c[6]=i7;c[7]=i8;
}
leng=leng-a[i6][i7];
leng=leng-a[i7][i8];
b[i7]=1;
}
leng=leng-a[i5][i6];
b[i6]=1;
}
leng=leng-a[i4][i5];
b[i5]=1;
}
leng=leng-a[i3][i4];
b[i4]=1;
}
leng=leng-a[i2][i3];
b[i3]=1;
}
leng=leng-a[i1][i2];
b[i2]=1;
}
System.out.println("最短路径为:"); //输出记录的最短路径的结果
System.out.print(c[0]);
for(int i=1;i<8;i++)
System.out.print("->"+c[i]);
System.out.print("\n");
System.out.println("最短路径长度为:"+min);
}
}