2013-10-10 3 views
0

Я работаю над TSP, который занимает большое количество городов, таких как 100, 500 и т. Д. Я написал код, используя жадный алгоритм, и отлично работает с использованием аргументов командной строки. Но мне нужно взять данные из файла, который имеет следующий формат.Принимая входные данные из файла Путешественник в C

  1. Первая линия число городов

  2. Вторая линия «евклидовой» or'not евклидовой»

  3. Теперь от 3-й линии мы имеем скоординировать из русских городов (с плавающей точкой)

  4. И после сердечников у нас есть матрица расстояний nxn для каждого города.

Нечто подобное позволяет принимать количество города быть 5

евклидовой

1,3 4,2

1,6 -3,5

1,4 1,5

6,4 3,6

4 2,4

теперь матрица затрат 5x5.

Как хранить все входные данные в массиве? (n, евклидово/неевклидово, кординаты, матрица). После ввода ввода мне нужно работать над самой матрицей.

+0

Структурированный массив может быть полезен – Programmer

ответ

1

Я бы не хранил все это в одном массиве. Прежде всего, беспокоиться о чтении числа городов. После того, как вы это знаете, вы можете выделить 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.

+0

Да, но как мы узнаем, что до этой строки вход идет в массив x [i], и после этого он переходит в матрицу стоимости [] []? – user2714823

+0

Я обновил свой ответ кодом, который реализует мой подход. –

+0

Спасибо, но я уже получил это :)! – user2714823

Смежные вопросы