Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Андреев_Довгалюк_лабор_СДиА.doc
Скачиваний:
23
Добавлен:
26.03.2015
Размер:
527.87 Кб
Скачать
    1. Задача о программисте Пете

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

Помогите Пете добраться до такси (вы скажите, добраться до дому – но я-то его знаю, домой Петя сегодня не пойдет), отдав минимальное количество дисков.

Площадь представляет собой квадрат, разбитый на N×Nклеток. В каждой клетке стоит программист, который хочет отобрать у Пети некоторое заранее известное число дисков. Путь Пети начинается в юго-восточном и заканчивается в северо-западном углу площади. За один шаг он может переместиться либо на одну позицию на север, либо на одну позицию на запад.

Входные данные

Первая строка входного файла содержит количество тестовых наборов Q(0 <Q< 10000).

Далее следует Qблоков следующего вида:

Строка, содержащее целое число размер площади – N(0 <N< 50);

Nстрок: в каждой строке поNцелых чисел в диапазоне от 0 до 10.

Число, стоящее в I-й строке вJ-й позиции показывает, сколько дисков отберут у Пети в данной клетке. Номера строк растут на север, номера чисел в строках - на запад.

Выходные данные

Вывод состоит из Qстрок следующего вида:

Номер_Тестового_Набора Минимальное_Число_Отданных_Дисков Минимальный_Маршрут.

Маршрут представляет собой последовательность символов СиЗ, соответствующих перемещениям на север и на запад соответственно.

Если оптимальных маршрутов несколько, то допускается вывести любой из них.

    1. Математическая модель

Приведем математическую формулировку задачи:

Маршрутом в квадратной матрице Aпорядкаnназовем последовательность ее элементов, причем следующий элемент отличается от предыдущего тем, что у него либо номер строки, либо номер столбца на единицу больше чем у предыдущего. Требуется найти маршрут (или маршруты), содержащий элементыa11иann, с минимальной суммой элементов.

Замечание:

Искомый маршрут содержит (2n-1) элементов.

    1. Решение задачи о программисте Пете полным перебором

Идея решения задачи полным перебором следующая: на каждом шаге идем туда, где отберут меньше дисков.

Одна из возможных реализаций этой идеи приведена ниже. Кратко поясним ее. Строки 2 – 3 – подключение библиотеки стандартного ввода-вывода и библиотеки работы со строками. Строка 5 подключает библиотеку функций времени. Строка 7 – 8 – описываются константы: максимальный размер площади и максимальное число тестовых наборов соответственно. Строки 10 – 12 – описываем глобальные массивы Софийская площадь и оптимальный маршрут. Использование глобальных переменных продиктовано стремлением максимально упростить вызовы и саму процедуру поиска оптимального маршрута. Строки 19 – 60 – описание процедуры поиска оптимального маршрута. Строка 21 – описание переменных, минимальной цены шага на север и запад соответственно. Строка 22 – описание переменной, минимальный северный маршрут. Далее процедура достаточно хорошо откомментирована, объясним только некоторые неясные моменты. Строки 48 – 50 – после прохода на север в глобальном массиве m сохранен оптимальный маршрут от следующего и до последнего шага. Если теперь идти на запад, то содержимое строки m утратится. Потому мы сохраняем m в nm. После выполнения данного фрагмента в m хранится часть оптимального маршрута на запад, а в nm – на север. Если в 52 строке мы решили, что на север идти дешевле, то в 55 строке записываем в m часть оптимального маршрута на север из nm. Строки 62 – 96 – описание функции main. Строка 67 – 69 – объявление переменных, соответственно: число тестовых наборов, размер площади, счетчики циклов (число тестовых наборов, число строк, число столбцов), цена минимального маршрута. Строки 71 – объявим две переменные: время начала и окончания счета. Строка 76 – считываем число тестовых наборов. 77 – 93 – цикл решения задачи для каждого тестового набора. Строки 80 – 82 – ввод размера площади и данных о дисках. Строка 83 – запомним начало отсчета времени. Строка 85 – вызов функции поиска минимального маршрута и его цены. Строка 88 – 92 –запомним окончание счета времени, выведем номер тестового набора, его размер и время выполнения, минимальную стоимость и минимальный маршрут. Строка 95 – возвратим код успешного завершения породившему процессу.