09.02.13
Разбор задач с «Ломоносова» по информатике ч.3 09.02.13

Йохохо, %USERNAME%! Прошло уже много времени с момента последней записки. Сдается мне, ты жаждешь новых знаний? И я тоже ;) Итак. Сегодяншний разбор посвящен заданию №4 «Маджонг». Подробности под катом!

Все разборы:

  1. Разбор задач с “Ломоносова” по информатике, ч. 1
  2. Разбор задач с “Ломоносова” по информатике, ч. 2
  3. Разбор задач с “Ломоносова” по информатике, ч.3

Не стану скрывать факт того, что я- закоренелый веб- девелопер. Моя стезя PHP, Python, JS. Ну, чутка C++. А что из этого следует? Правильно: ничего. Как не печально, но это задание я не решил. А почему эта записка существует? Сорцы я использую нагло и без разрешения, и разбираться будем вместе.

Если тебе не интересен полный исходный код, прошу в конец записки за листингом на Processing( потомок Java), иначе: «Да начнется экшн!» :) Скачать все задачи можно тут.

Дисклеймер: я не знаком с Java, потому прошу не ругать за ошибки в описаниях..

 Условие задачи

В решении задачи обязательно указывайте использованные источники информации о
правилах игры (например, ссылки на веб сайты). Рассмотрим упрощенный вариант игры Маджонг,
в которой 32 пары костей, занумерованных числами от 1 до 32, выкладываются на игровом поле в
куб размером 4x4x4. Куб состоит из 4 слоев (первый слой – самый нижний, а четвертый – самый
верхний). Каждый слой состоит из 16 костей, выложенных в квадрат 4×4. Кости слоев лежат
строго друг на друге.
Конфигурацию игрового поля назовем тупиковой, если в этой конфигурации нельзя снять ни
одной пары костей. Дана начальная конфигурация игрового поля. Определите сумму номеров
костей, оставшихся на игровом поле в тупиковой конфигурации… *4 таблички с конфигами*.

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

  • Снимать можно только две одинаковые кости за раз. В условии сказано, что кости обозначены цифрами
  • Снимать можно только незакрытые сверху кости. По условию они расположены
    не в виде пирамиды, а кубом, следовательно кость может быть блокирована только одной костью сверху
  • У кости должна быть как минимум пара свободных соседних костей на том же уровне, иначе её
    нельзя снять

Теперь по кусочкам разберем код в конце записки:

Класс «Rect». Если я правильно понял, то этот класс отвечает за создание куба и проверку его на существование.

 Класс «Bone».

  • Метод Rect rect() возвращает кость по заданным координатам
  • Метод bone создает кость в заданных координатах
  • res() обнуляет элемент трехмерного массива по координатам x,y,h
  • До сокрального смысла eq() я так и не додумал :)
  • И конечно же метод Free, который освобождает кость по координатам

Функции и переменные

Первым делом автор программы задает конфигурацию поля из условия задачи в трехмерном массиве:

Дальше определяет размеры куба относительно всего размера рабочей области и переменную hmw:

Processing ведь очень хорошо подходит для прототипирования графических приложений, а потому создается рабочая область 640х480

И функция, рисующая кости:

В классе Rect определяется метод rectFor()

Функция isUpperOn возвращает true, если над костью нет другой и false, если есть:

Функция getValue, как очевидно из названия, извлекает из трехмерного массива значение кости по координатам

А теперь то, без чего совершенно точно ничего реботать не будет. pushBone() убирает кость, получая на входе ее объект класса Bone

Так как тулза графическая, то необходимо обрабатывать нажатия мыши

Не совсем понял, что делает функция checkForChecked, буду рад, если кто- то подскажет

И наконец то, что будет это все связывать воедино и рендерить: функция drawBone

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

Итак, ответ задачи: 1056.

Записка, я так думаю, получилась отвратительная. Но я надеюсь, что маньяк, знающий Java, поможет мне понять и поподробнее описать все это.

Спасибо за прочтение, %USERNAME%, удачного кодинга, интересных реальных задач и адекватных клиентов!

Листинг решения задачи №4 «Маджонг» на Processing