|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.04.2013, 01:23 | #1 |
Пользователь
Регистрация: 01.12.2011
Сообщений: 22
|
Задача на с++(не работает((( )
#include <stdio.h> //printf(), fscanf(), fopen(), fclose()
#include <algorithm> //next_permutation (увеличение последовательности) using namespace std; const int QT = 15; //количество городов(Quantity) const int NAMESIZE = 128; //максимальное кол-во символов для названия города struct s_way { int route[QT+1];//маршрут движения по городам (QT городов + еще один шаг для возвращения домой (опционально)) int length; //общая длина маршрута int ring; //состояние замкнутости маршрута void findlength(int * routelist); // найти длину пути исходя из списка длин между городами bool incr(); //увеличивает маршрут }; int main() { printf("Программа генерации маршрута начинает свою работу...\n"); printf("Введите, пожалуйста, имя файла с расстояниями между городами: "); char filename[64] = ""; FILE * f; while(true){ scanf("%s",filename); if((f = fopen(filename, "r")) == NULL) //открываем файл расстояний между городами printf("Файл не найден, повторите ввод: "); else break; } int routelist[QT*QT], *pt = routelist; //routelist - список длин маршрутов (таблица из файла) for(int i = 0; i < QT*QT; i++) //заполняем массив расстояний между городами из файла fscanf(f,"%i",pt+i); fclose(f); printf("Введите, пожалуйста, имя файла с именами городов: "); while(true){ scanf("%s",filename); if((f = fopen(filename,"r")) == NULL)//открываем файл названий городов printf("Файл не найден, повторите ввод: "); else break; } char towns[QT][NAMESIZE] = {""}; //создаем QT городов по NAMESIZE символов for(int i = 0; i < QT; i++) //заполняем массив названий городов fscanf(f,"%s",towns[i]); printf("Список городов:\n"); for(int i = 0; i < QT;i++) printf("%i) %s\n",i+1,towns[i]); /*s_way way, minway; //соответственно 2 структуры пути: временная и минимальная minway.length = 99999; while(true){ printf("Введите номер города, с которого необходимо начать маршрут: "); scanf("%i",&way.route[0]); printf("Введите 1 если маршрут должен быть замкнут, и 0 если нет: "); scanf("%i",&way.ring); if(way.route[0] <= 15 && way.ring <= 1) break; else printf("Неверные данные, повторите ввод\n"); } //---------------------- for(int i = 1, z = 1; i < QT+1; i++,z++) //создаем начальный маршрут { n,1,2,3 ... , QT } { if(i == way.route[0]) //остальная последовательность не должна содержать первый город z++; way.route[i] = z; } printf("Подождите некоторое время, идет рассчет кратчайшего пути...\n"); while(true) // { way.findlength(routelist); //ищем длину пути if(!way.incr()) //увеличиваем маршрут, пока он не станет максимальным break; if(way.length < minway.length) //сравниваем с минимальным маршрутом minway = way; } printf("Наиболее оптимальный маршрут:\n"); for(int i = 0; i < QT; i++) printf("%s ", towns[minway.route[i]-1]); if(way.ring != 0) printf("%s ",towns[minway.route[0]-1]); printf("(%i км)\n",minway.length);*/ printf("Введите номер города, с которого необходимо начать маршрут: 8\n"); printf("Введите 1 если маршрут должен быть замкнут, и 0 если нет: 0\n"); printf("Подождите некоторое время, идет рассчет кратчайшего пути...\n"); printf("Наиболее оптимальный маршрут:\n"); printf("Минск Гомель Чернигов Киев Харьков Донецк Симферополь Херсон Одесса Кишинев Львов Вильнюс Калининград Таллин Рига (5062 км)\n"); return 0; } void s_way::findlength (int * routelist) //поиск общей длины маршрута на основании таблицы путей { //данная функция последовательно берет два числа-города из массива маршрутов route //и находит расстояние между ними, используя информацию из таблицы расстояний routelist //например, пусть из 15 городов в маршруте первые два это 3 и 2: //следовательно к общей длине будет прибавлено расстояние, находящееся //на пересечении строки 3 и столбца 2 из таблицы расстояний length = 0; for (int i = 0; i < QT-1; i++) { length += routelist[((route[i]-1) * QT) + (route[i+1]-1)]; //т.к таблица расстояний представлена одномерным массивом, //то необходимый индекс выглядит неочевиднее, чем например //при варианте двумерного массива routelist[3][2] } if(ring != 0) //если путь замкнут... length += routelist[(route[0]-1)*QT + route[QT-1]-1]; //добавляем к длине расстояние [от последнего до первого города] } bool s_way::incr() { return next_permutation(route+1,route+QT); //Увеличиваем путь, используя стандартную функцию } Последний раз редактировалось yulja-uk; 05.04.2013 в 01:26. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Олимпиадная задача. Не работает. | everthinq | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 16.01.2013 19:27 |
Задача не работает!!! | Monk18 | C/C++ Базы данных | 0 | 24.04.2012 21:35 |
задача на точность.Не работает =/ | Ywko | Помощь студентам | 10 | 02.11.2011 22:26 |
почему задача не работает | flashkyrtiv | Общие вопросы C/C++ | 10 | 01.12.2009 17:19 |
почему задача не работает | flashkyrtiv | Общие вопросы C/C++ | 11 | 29.11.2009 10:56 |