计算距离

时间:2017-09-29 19:48:46

标签: c function struct

练习让我读了一个输入档案,如下所示:

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;
}

我想知道是否存在错误以及为什么计算的距离具有相同的值。有更好的计算方法吗?

1 个答案:

答案 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;