Я бы не хранил все это в одном массиве. Прежде всего, беспокоиться о чтении числа городов. После того, как вы это знаете, вы можете выделить 2 массива: один из них содержит структуру с координатами для каждого города, а другой - это 2D-массив, в котором вы храните затраты.
Это предполагает, что вы смотрите на города и считаете их: в вашем примере город с координатами 1.3 4.2 будет городом 0 (сохраняется в позиции 0 массива); город с 1,6 -3,5 будет находиться на позиции 1 и т. д. Таким образом, в основном вы будете делать:
- Прочитать количество городов, x;
- Прочитайте, является ли это евклидовой или нет, сохраните это в некоторой переменной;
- Выделяют массив города из х элементов, а другой двумерная матрица стоит х по х;
- Читайте координаты каждого города, и хранить их в городах [I] (города должен быть массив структуры с 2 поплавками для хранения координаты);
- Для каждой строки i (i, начиная с 0), и для каждого столбца j в этой строке (также начиная с 0) установите стоимость [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 был использован в начале, потому что зсап («% d», & citiesNo) оставил бы новую строку в буфере, и последующий fgets() возвращает пустую строку. Если вы предпочитаете, вы можете заменить оба fgets() на scanf(), я просто не читал евклидовую строку с scanf, потому что она не проверяет размер буфера. Если ваш вход всегда хорошо сформирован, это не проблема.
После этого кода у вас есть строка с "евклидовым" или "неевклидовым", хранящимся в переменной euclidean.
Структурированный массив может быть полезен – Programmer