练习让我读了一个输入档案,如下所示:
4
1 10
4 4
5 1
2 0
第一个数字(4)表示城市数量,下面的每一行代表一个坐标为(x,y)
的城市。每个城市都由结构代表:
typedef struct
{
int x;
int y;
} Cidade;
这部分练习我已经完成了,没关系。下一步,我需要在输出档案中打印这些城市的所有可能路线,并计算路线的总距离,记住最后一个应该是起点。为此,我做了一个排列函数,它适合我。功能如下:
void Troca(int *x, int *y)
{
int aux;
aux = *x;
*x = *y;
*y = aux;
}
void Permuta(FILE *saida, Cidade *C, int *sequencia, int inicio, int
termino, int totalViagens)
{
int i, j;
if(inicio == termino)
{
for(i = 0; i < termino; i++)
fprintf(saida, "%d\t", sequencia[i]+1);
fprintf(saida, "= %f\n", Distancia(C, termino));
}
else
{
for(j = inicio; j < termino; j++)
{
Troca((sequencia+inicio), (sequencia+j));
Permuta(saida, C, sequencia, inicio+1, termino, totalViagens);
Troca((sequencia+inicio), (sequencia+j));
}
}
}
使用此输入存档,我得到以下输出:
24
1 2 3 4 = 23.032759
1 2 4 3 = 23.032759
1 3 2 4 = 23.032759
1 3 4 2 = 23.032759
1 4 3 2 = 23.032759
1 4 2 3 = 23.032759
2 1 3 4 = 23.032759
2 1 4 3 = 23.032759
2 3 1 4 = 23.032759
2 3 4 1 = 23.032759
2 4 3 1 = 23.032759
2 4 1 3 = 23.032759
3 2 1 4 = 23.032759
3 2 4 1 = 23.032759
3 1 2 4 = 23.032759
3 1 4 2 = 23.032759
3 4 1 2 = 23.032759
3 4 2 1 = 23.032759
4 2 3 1 = 23.032759
4 2 1 3 = 23.032759
4 3 2 1 = 23.032759
4 3 1 2 = 23.032759
4 1 3 2 = 23.032759
4 1 2 3 = 23.032759
第一个数字(24)表示所有可能的路线,而下面的每一行包含城市的索引+ 1。其末尾的浮点数是每条路线的距离,我应该在程序结束时比较哪些路径并告诉最短路径。但是我得到了这个结果(这是错误的):所有路线的所有距离都有相同的值。我用来计算这些距离的函数如下所示:
float Distancia(Cidade *C, int numeroCidade)
{
int i;
float total = 0;
for(i = 0; i < numeroCidade; i++)
{
if(i == numeroCidade-1)
{
int distanciaX = pow(C[i].x - C[0].x, 2);
int distanciaY = pow(C[i].y - C[0].y, 2);
total = total + sqrt(distanciaX + distanciaY);
}
else
{
int distanciaX = pow(C[i].x - C[i+1].x, 2);
int distanciaY = pow(C[i].y - C[i+1].y, 2);
total = total + sqrt(distanciaX + distanciaY);
}
}
return total;
}
我想知道是否存在错误以及为什么计算的距离具有相同的值。有更好的计算方法吗?
答案 0 :(得分:2)
您的Distancia
功能目前每次都会通过您的城市列表,使用相同的numeroCidade
,因此它始终会得到相同的结果。
你想让它通过你的城市序列。你的功能应该是这样的。 (不过,我会把部分内容留给你完成。)
float Distancia(Cidade *c, int numeroCidade, int* sequencia)
{
int i;
float total = 0;
float distance;
for (i = 0; i < numeroCidade; i++)
{
/* distance from one city in the sequence to the next = ... ? */
float = float + distance;
}
return float;