从C中的旅行推销员的文件中获取输入

时间:2013-10-10 09:19:40

标签: c file-io traveling-salesman

我正在研究占用大量城市的TSP,如100,500等。我使用贪婪算法编写了一个代码,使用命令行参数工作正常。但我需要从具有以下给定格式的文件中获取输入。

  1. 第一行是城市数量

  2. 第二行是'euclidean'或'not euclidean'

  3. 现在从第3行我们有n个城市的坐标(浮动)

  4. 在坐标之后,每个城市都有nxn距离矩阵。

  5. 这样的东西可以让城市的数量为5

    5

    欧氏

    1.3 4.2

    1.6 -3.5

    1.4 1.5

    6.4 3.6

    4 2.4

    现在是一个5x5的成本矩阵。

    如何将所有输入存储在数组中? (n,欧几里德/非欧几里德,坐标,矩阵)在输入后我需要处理矩阵本身。

1 个答案:

答案 0 :(得分:1)

我不会将它全部存储在一个单独的数组中。首先,担心阅读城市数量。在您知道之后,您可以分配2个数组:其中一个数组包含一个具有每个城市坐标的结构,另一个数据是存储成本的2D数组。

这假设您查看城市并计算它们:在您的示例中,坐标为1.3 4.2的城市将为城市0(存储在数组的位置0); 1.6-3.5的城市将位于第1位,等等。所以,基本上你将会这样做:

  • 读取城市数量x;
  • 读取它是否是欧几里德,将其保存在某个变量中;
  • 分配x个元素的数组 cities ,另一个 二维数组成本 x x;
  • 阅读每个城市的坐标,并将其存储在城市[i] (城市 应该是一个带有2个浮点数的结构数组来存储 坐标);
  • 对于每一行i(我从0开始)和该行中的每一列j (也从0开始),将cost [i] [j]设置为中的任何值 输入

以下是实现此方法的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 32

struct city {
    float c1;
    float c2;
};

int main(void) {
    int citiesNo, i, j;
    struct city *cities;
    float **cost;
    char line[BUFSIZE], euclidean[BUFSIZE];
    fgets(line, BUFSIZE, stdin);
    citiesNo = atoi(line);
    fgets(line, BUFSIZE, stdin);
    strcpy(euclidean, line);

    cities = malloc(sizeof(struct city)*citiesNo);
    cost = malloc(sizeof(float *)*citiesNo);

    for (i = 0; i < citiesNo; i++)
        cost[i] = malloc(sizeof(float)*citiesNo);

    /* Read coordinates */
    for (i = 0; i < citiesNo; i++)
        scanf("%f %f", &(cities[i].c1), &(cities[i].c2));

    /* Read costs */
    for (i = 0; i < citiesNo; i++)
        for (j = 0; j < citiesNo; j++)
            scanf("%f", &(cost[i][j]));

    /* Everything is stored now... */

    return 0;
}

fgets在开头使用,因为scanf(“%d”,&amp; citiesNo)会在缓冲区中留下换行符,后续的fgets()调用将返回一个空行。如果您愿意,可以用scanf()替换两个fgets(),我只是没有用scanf读取euclidean字符串,因为它没有进行缓冲区大小检查。如果您的输入总是很好,那么这不是问题。

此代码运行后,您在变量 euclidean 中存储了一个包含“euclidean”或“not euclidean”的字符串。