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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2011, 20:41   #1
Icekream
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию матрица - кирпичи

Поджалуйста, помогите с решением задачи. Вот условие:"Стена для рекламных щитов из М рядов по N одинаковых кирпичей в каждом. Каждый последующий ряд смещён относительно предыдущего на 1/2 кирпича. Четные ряды сверху смещаются влево, а нечётные вправо. конфигурация из кирпичей является устойчивой, если каждый кирпич опирается по крайней мере, на один кирпич в нижележащем ряду. Очевидно, что из заданной конструкции можно удалить некоторые кирпичи без потери её устойчивости.
Требуется:
Написать программу, которая по заданным числам M и N (0<M, n<1000) находит конструкцию, получающуюся из исходной путём удаления, по возможности максимального количества кирпичей, чтобы верхний ряд остался без изменений, а конструкция не потеряла устойчивость." Надо решить с помощью режима CRT a не GRAPH.Это срочно! Заранее спасибо.
Icekream вне форума Ответить с цитированием
Старый 01.11.2011, 23:10   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Что должно являться выходом программы? В каком виде должна быть "конструкция"?
Abstraction вне форума Ответить с цитированием
Старый 02.11.2011, 21:35   #3
Icekream
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

входные данные: кол-во столбцов и строк,
выходные данные выводится кол-во оставшихся чисел(кирпичей). Удаляемые числа равны нулю
каждая строка начинается с единицы и далее идёт по порядку
вот пример того что должно получиться:
После ввода данных:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
Полученная матрица:
1 2 3 4 5
1 0 3 0 5
2 0 4 5
2 0 4 5
Icekream вне форума Ответить с цитированием
Старый 02.11.2011, 21:36   #4
Icekream
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

только каждая матрица идёт в шахматном порядке, как кирпичи
Icekream вне форума Ответить с цитированием
Старый 02.11.2011, 22:59   #5
Icekream
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

Первая матрица:
1 2 3 4 5
_1 2 3 4 5
1 2 3 4 5
_1 2 3 4 5
Полученная матрица:
1 2 3 4 5
_1 0 3 0 5
__2 0 4 5
___2 0 4 5
Только без подчёркиваний
Icekream вне форума Ответить с цитированием
Старый 02.11.2011, 23:29   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Ответ в примере неправильный. Удалено шесть кирпичей, можно восемь.
Код:
1 2 3 4 5
 1 2 0 4 0
0 2 0 4 0
 0 2 3 0 0
Что-то общую логику нащупать не получается. Значит, пускаем в ход граф выбора.
1) Верхний ряд должен остаться на месте - это не обсуждается.
2) Для следующего вниз ряда, при данной конфигурации предыдущего есть конечное множество минимальных (т.е. таких, из которых нельзя вынуть кирпич) комбинаций, его поддерживающих. Для любой неминимальной комбинации ряда, стену с очевидностью можно улучшить. Минимальные комбинации можно пока найти простым перебором комбинаций (для каждой - вначале проверка, поддерживает ли она вышележащий ряд, если да - то набор попыток убрать имеющиеся кирпичи), а на досуге придумать способ получше.
3) Начиная с верхнего ряда как отправной точки, мы строим "Фронт". "Фронт" состоит из множества "частичных вариантов"; "частичный вариант" - это карта некоторого количества верхних слоёв стены и "вес". Изначально "фронт" состоит из одного варианта "заполненный верхний ряд", с "весом" N.
4) На каждом шаге мы перебираем фронт. Нам нужен элемент, у которого "вес" минимален. Если этот вариант дошёл донизу, он и есть решение. Если нет, мы убираем этот вариант из "фронта", строим все возможные варианты ряда ниже, и каждый раз добавляем во "фронт" текущий вариант с таким присоединённым нижним рядом и "весом", равным "весу" исходного элемента, плюс количество кирпичей в присоединённом ряду и минус один. Такой анализ займёт конечное время и даст в результате оптимальный вариант.

Обратите внимание, что под словом "множество" понималась структура данных, неспособная содержать два одинаковых элемента. Если реализовывать её списком, то при добавлении во "фронт" новых вариантов, необходимо проверять, не лежит ли уже там такой.
Abstraction вне форума Ответить с цитированием
Старый 03.11.2011, 21:35   #7
Icekream
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

А как должен выглядеть листинг программы?
Icekream вне форума Ответить с цитированием
Старый 03.11.2011, 21:56   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

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

Как это написать на Pascal? Хороший вопрос; надеюсь, кто-нибудь ответит...
Abstraction вне форума Ответить с цитированием
Старый 04.11.2011, 20:07   #9
Icekream
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

Спасибо за помощь, так как вы подали мне идею))
Icekream вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
матрица 2 jennyjen Помощь студентам 5 09.12.2010 21:18
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
TurboPascal: граф, матрица смежности и матрица инцидентности. ulala Помощь студентам 0 02.12.2009 10:11
матрица lucky Общие вопросы Delphi 0 31.05.2009 19:16
Матрица на C++ Maxs Помощь студентам 5 31.05.2009 14:35