Рубрики

Игра с номерами

Игра: рассмотрим массив квадратов n × n. Некоторые из квадратов пусты, некоторые сплошные, а некоторые не сплошные квадраты отмечены целыми числами 1, 2, 3,… Каждое целое занимает ровно два разных квадрата на доске. Задача игрока состоит в том, чтобы соединить два вхождения каждого целого числа на доске простым путем, используя только горизонтальные и вертикальные движения. Не допускается, чтобы два разных пути пересекались. Ни один путь не может содержать сплошные квадраты (сплошные квадраты запрещено появляться на любом пути). Наконец, все не сплошные квадраты должны быть заполнены путями.

Алгоритм: чтобы подготовить правильную случайную головоломку с заданным размером доски n × n, мы сначала генерируем случайные простые взаимно непересекающиеся пути на доске. Если несколько изолированных квадратов остаются за пределами всех сгенерированных путей, пометьте эти изолированные квадраты как сплошные (запрещено). Затем мы поставляем конечные точки путей и список сплошных квадратов в виде головоломки.
Таким образом, мы сначала генерируем решение, а затем решаем головоломку из решения. Пути и сплошные квадраты разделяют доску n × n. Мы используем структуру данных union-find для создания этого раздела. Структура данных имеет дело с подмножествами набора из n ^ 2 квадратов на доске.

псевдокод:

  1. Найдите на доске квадраты (i, j) и (k, l) так, чтобы:
    (а) (i, j) и (k, l) являются соседями друг друга, и
    (б) ни (i, j), ни (k, l) не принадлежат ни одному пути, сгенерированному до сих пор. Если такая пара квадратов не найдена на всей доске, верните FAILURE / * Здесь, (i, j) и (k, l) — это первые два квадрата на новом строящемся пути. * /
  2. Создайте объединение двух деревьев объединения, содержащих (i, j) и (k, l).
  3. Повторите, пока текущий путь может быть расширен:
    Переименовать (i, j) = (k, l).
    Найдите случайный соседний квадрат (k, l) из (i, j) так, чтобы:
    (a) (k, l) не принадлежит ни одному сгенерированному пути (включая текущий)
    (b) единственный сосед (k, l) имеет на частично построенном пути тока это (i, j).
  4. Если такой сосед (k, l) не может быть найден, путь не может быть расширен, поэтому прервите цикл
  5. В противном случае создайте объединение двух объединяющих деревьев, к которым принадлежат (i, j) и (k, l).
  6. Установите флаги конечных точек двух квадратов, которые находятся в начале и в конце нового пути.
  7. Вернуться УСПЕХ

Полный рабочий код статьи .

Эта статья предоставлена Вайбхавом Аггарвалом. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Рекомендуемые посты:

Игра с номерами

0.00 (0%) 0 votes