我正在研究占用大量城市的TSP,如100,500等。我使用贪婪算法编写了一个代码,使用命令行参数工作正常。但我需要从具有以下给定格式的文件中获取输入。
第一行是城市数量
第二行是'euclidean'或'not euclidean'
现在从第3行我们有n个城市的坐标(浮动)
在坐标之后,每个城市都有nxn距离矩阵。
这样的东西可以让城市的数量为5
5
欧氏
1.3 4.2
1.6 -3.5
1.4 1.5
6.4 3.6
4 2.4
现在是一个5x5的成本矩阵。
如何将所有输入存储在数组中? (n,欧几里德/非欧几里德,坐标,矩阵)在输入后我需要处理矩阵本身。
答案 0 :(得分:1)
我不会将它全部存储在一个单独的数组中。首先,担心阅读城市数量。在您知道之后,您可以分配2个数组:其中一个数组包含一个具有每个城市坐标的结构,另一个数据是存储成本的2D数组。
这假设您查看城市并计算它们:在您的示例中,坐标为1.3 4.2的城市将为城市0(存储在数组的位置0); 1.6-3.5的城市将位于第1位,等等。所以,基本上你将会这样做:
以下是实现此方法的代码:
#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”的字符串。