题目内容:
有5个城市(A,B,C,D,E),其中每个城市到其他城市的直达距离已知,两个城市之间只有一条公路。计算从 城市A到其他任意城市的最短路径距离。
输入描述
4行数据, 第一行是A到(B,C,D,E)的直达距离,第二行是B到(C,D,E)的直达距离,。。。,第4行是D到E的直达距离。
输出描述
A城市到(B,C,D,E)的最短距离。
输入样例
2 3 4 5
3 4 2
4 3
有5个城市(A,B,C,D,E),其中每个城市到其他城市的直达距离已知,两个城市之间只有一条公路。计算从 城市A到其他任意城市的最短路径距离。
输入描述
4行数据, 第一行是A到(B,C,D,E)的直达距离,第二行是B到(C,D,E)的直达距离,。。。,第4行是D到E的直达距离。
输出描述
A城市到(B,C,D,E)的最短距离。
输入样例
2 3 4 5
3 4 2
4 3
3
2 3 4 4
分析:一共有5个城市,从一个城市到另外四个城市有很多条路径。要把所有的情况都整理出来,可以用全排列来实现,然后对城市A,比较他到剩下四个城市的距离,找出最小的就ok了
#include<stdio.h>
int c[24][5];
int k = 0;
void fun(int b[],int m,int n)//对数组递归进行全排列
{
int temp;
int i,j;
if(m == n)
{
for(i = 0;i < 5; i++)
c[k][i] = b[i];
k++;
}
else
{
for(j = m;j < n; j++)
{
temp = b[m];
b[m] = b[j];
b[j] = temp;
fun(b,m+1,n);
temp = b[m];
b[m] = b[j];
b[j] = temp;
}
}
}
int main()
{
int a[5],e[2][10],f[4];
int i,j,x = 1,l;
int sum[4] = {0,0,0,0};
int count[4] = {100,100,100,100};
e[0][0] = 1;
e[0][1] = 2;
e[0][2] = 3;
e[0][3] = 4;
e[0][4] = 12;
e[0][5] = 13;
e[0][6] = 14;
e[0][7] = 23;
e[0][8] = 24;
e[0][9] = 34;
for(i = 0;i < 5; i++)
a[i] = i;
for(i = 0;i < 10; i++)
scanf("%d",&e[1][i]);
for(i = 0;i < 24; i++)
for(j = 0;j < 5; j++)
c[i][j] = 0;
fun(a,1,5);
for(x = 0;x < 4; x++)
{
for(i = 0;i < 24; i++)
{
sum[x] = 0;
for(k = 0;k <= 4;k++)
{
if(c[i][k] == x+1)
break;
else if(c[i][k] != x+1)
{
f[0] = c[i][k];
f[1] = c[i][k+1];
for(l = 0;l < 10; l++)
{
f[2] = e[0][l]/10;
f[3] = e[0][l]%10;
if(((f[0] == f[2])&&(f[1] == f[3]))||((f[0] == f[3])&&(f[1] == f[2])))
sum[x] = sum[x] + e[1][l];
}
}
}
if(sum[x] < count[x])
count[x] = sum[x];
}
}
printf("\n\n");
for(i = 0;i < 24; i++)
{
for(j = 0;j < 5; j++)
printf("%d",c[i][j]);
printf("\n");
}
for(i = 0;i < 4; i++)
printf("%d ",count[i]);
return 0;
}