Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2013, 01:23   #1
yulja-uk
Пользователь
 
Регистрация: 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.
yulja-uk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Олимпиадная задача. Не работает. 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