Рубрики
Без рубрики

Визуализация дефектной задачи доски

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

Плиточная шахматная доска

Дефектная проблема шахматной доски, также известен как Проблема на плите это интересная проблема. Обычно это решается с подходом «разделить и завоевать». Алгоритм имеет временную сложность O (n²) Отказ

Эта проблема

Учитывая n по n Доска, где n имеет форму 2 ^ k, где k (в основном, n – мощность 2 с минимальным значением как 2). Доска имеет одну недостающую площадь). Заполните доску, используя трионимос. Трионимо представляет собой L-образную плитку – это блок 2 × 2 с одной ячейкой размером 1 × 1 отсутствует.

Решение проблемы эффективно не целью этого поста. Визуализируя доску в качестве алгоритма прогонов гораздо интереснее на мой взгляд. Давайте обсудим алгоритм первым.

Доска без дефектов добавлено

Алгоритм

Как упоминалось ранее, метод Divide-Anquer (DAC) используется для решения проблемы. ЦАП влечет за собой расщепление большей проблемы в подпроставлениях, гарантируя, что каждая подпроформация является точной копией большего, хотя и меньше. Вы можете увидеть, куда мы идем с этим, но позволяет сделать это явно.

Вопрос, который мы должны спросить, прежде чем написать алгоритм: это даже возможно? Ну да. Общее количество квадратов на нашей доске – n ² или 4 ^ k . Удаление дефекта, у нас было бы 4 ^ к – 1, который всегда много из трех. Это может быть довольно легко доказано с математической индукцией, поэтому я не буду обсуждать это.

Доска в начальном состоянии (с добавленным дефектом)

Базовый случай

Каждый рекурсивный алгоритм должен иметь базовый случай, чтобы гарантировать, что он прекращает. Для нас давайте рассмотрим случай, когда n , 2 ^ к 2. Таким образом, у нас есть 2 × 2 блок с одним дефектом. Решение этого тривиально: остальные 3 квадрата, естественно, образуют трионимо.

Рекурсивный шаг

Чтобы сделать любую подзаголовую проблему меньшую версию нашей оригинальной проблемы, все, что нам нужно сделать, это добавить наши собственные дефекты, но в течение очень конкретного способа. Если вы посмотрите, добавляя «дефект» трионимо в центре, с одним квадратом в каждом из четырех квадрантов нашей доски, за исключением того, что с нашим оригинальным дефектом позволят использовать четыре правильных подпроставления В то же время гарантируя, что мы можем решить полную проблему, добавив последний трионимо, чтобы прикрыть три псевдофирующие квадраты, которые мы добавили.

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

Шаг сочетания

После решения каждая из четырех под-проблем и вкладывая их вместе, чтобы сформировать полную доску, у нас есть 4 дефекта в нашей доске: оригинал будет лежать в одном из квадрантов, а остальные три были те, которые мы намеренно добавлены к решению проблема с использованием ЦАП Отказ Все, что нам нужно сделать, это добавить окончательный трионимо, чтобы прикрыть эти три «дефекты», и мы сделаем.

Таким образом, рекурсивное уравнение для сложности времени становится:

T (n) (n/2) + c

4 исходит от того факта, что для решения каждой проблемы ввода N, мы разделяем его в 4 подпроставлениям размера ввода N/2 (половина длины оригинальной доски). Как только мы закончим решение этих подпроблем, все, что осталось сделать, – это сочетать их: это делается путем добавления последнего Trionimo для покрытия псевдо-дефектов, которые мы добавили. Это, конечно, сделано в постоянном времени.

Если вы заинтересованы в нахождении асимптотического времени сложности рецидива, вы можете попробовать Метод рекурсионного дерева или Метод замены . На данный момент давайте просто использовать Мастер Теорема Отказ

Мастер Теорема говорит, что для рецидива соотношения формы:

T (n) (n/b) + f (n)

Сложность зависит от сложности f (n) и n ^ log_b (а) (Журнал для базы B ).

Случаи на изображении ниже говорят нам, какой случай нам нужно использовать здесь.

Главная теорема. От brilliant.org

Поскольку значение n ^ log (a) base b is n ², пока термин f (n) имеет постоянную сложность, мы используем Случай 1, которые в конечном итоге говорят нам, что наш алгоритм имеет порядок n ² Отказ Другими словами, временная сложность нашего алгоритма является O ( n ²).

Код

Первоначально каждый квадрат представлен 0. A ‘-1’ представляет собой дефектный квадрат и появится черным в участках. Каждый Trionimo будет отображаться с уникальным числом, который будет увеличиваться, поскольку добавляется больше трионимосов.

Опять же, цель кода не оптимизация – его делать как можно больше с нуля (в простом питоне).

Я прокомментировал код ниже, поэтому он должен быть довольно прямым.

Импорт необходимых библиотек

Случайная библиотека используется для случайного выбора квадрата, чтобы быть неисправным, просто для запуска проблемы, и, конечно, Sebornogrous, конечно, для визуализации.

Создание доски

Ничего не сумасшедшего: просто создавая двумерный список Python. Алгоритм может быть оптимизирован с использованием таких структур, как Numpy Armay вместо списков ванильных питонов. Список инициализируется с 0.

Добавление дефекта случайно

Здесь мы случайно выбираем элемент, используя Randint () и сделать его неисправным плиткой. Мы будем представлять дефекты с -1.

Расположение дефекта при решении каждой подпроставления

Мы делаем здесь две вещи:

  • Расположение строки и столбца дефекта
  • определение того, какой квадрант доски дефект лежит в

Первый шаг может быть оптимизирован с помощью Numpy Functions вместо подхода «от царапин» ниже.

Добавление трионимос

Эта функция добавляет трионимо до 2 х 2 секции платы. Здесь квадрант дефекта пригодится, поскольку мы можем просто определить словарь, чтобы решить, как добавить нашу Trionimo.

Рекурсивная функция черепицы

Это реализация деления и завоевания нашего алгоритма плиток. Функция выполняет следующее:

  • Определение расположения дефекта в данном разделе Правления (строки R1 и R2 и столбцы C1 и C2 позволяют функции сосредоточиться на определенном разделе доски).
  • Добавление трионимо, если мы имеем дело с сечением 2 х 2
  • в противном случае, Добавление трех дефектов в центр
  • рекурсивно решение каждого квадранта доски
  • Добавление окончательного Trionimo для покрытия трех дефектов, которые мы добавили в центре.

Функция родительской черепицы

Это просто делает очиститель интерфейса, поскольку мы технически у нас есть только два независимых аргумента: доска и параметр k (Ну, K может быть рассчитан или используется в качестве глобальной переменной, но это до программиста).

Визуализация

Я использовал простой Морская теплоката отображать доску. Метод Drawboard () создает тепло-карту.

Две вызовы тепло-карты для более легко различать дефектные и неисправные квадраты:

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

Результат

Я затащил пост достаточно долго. Фрагмент ниже призыва вызывает соответствующие функции, позволяя нам просмотреть каждого из государств совета директоров.

Гиф доски как алгоритм бежит на нем

Первоначально опубликовано в https://polaris000.github.io 11 января 2020 года.

Оригинал: “https://dev.to/polaris000/visualizing-the-defective-chessboard-problem-4n0e”