Заполните заполнение сетки меандр


18

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

После заполнения каждая ячейка сетки может быть представлена ​​одной из следующих 8 плиток:

Пронумерованные таким образом, плитки вышеупомянутого меандра могут быть представлены этой матрицей:

5 6 5 6
4 8 3 2
5 7 6 2
4 3 4 3

Ваша задача завершить заполнение сетки меандром, учитывая неполный набор плиток. Например, неполный меандр:

... который можно представить с помощью 0s для отсутствующих плиток:

5 0 0 0 6
0 0 7 0 0
0 0 0 0 3
2 4 0 0 0
0 0 3 0 0

... может быть завершено так:

... то есть:

5 6 5 1 6
4 8 7 6 2
5 7 7 7 3
2 4 8 8 6
4 1 3 4 3

Характеристики

  • На входе всегда будет по крайней мере 1 и самое большее N2 (непустых) тайлов, где 2N7 .
  • Вы можете использовать любой набор значений для представления плиток, если это указано в вашем ответе.
  • Ваш ввод и вывод могут быть в любом формате и порядке, если это указано в вашем ответе.
  • По крайней мере одно действительное решение будет существовать для всех входных данных (т.е. вам не нужно обрабатывать неправильные входные данные).
  • Применяются стандартные правила ввода / вывода .
  • Стандартные лазейки запрещены.
  • Пояснения, даже для «практических» языков, приветствуются.

Контрольные примеры

Вход ( Θ ):

0 6
0 0

Выход ( Θ ):

5 6
4 3

Вход ( Θ ):

5 6 5 6
4 0 3 2
5 7 6 2
4 3 4 3

Выход ( Θ ):

5 6 5 6
4 8 3 2
5 7 6 2
4 3 4 3

Вход ( Θ ):

5 0 0 0 6
0 0 7 0 0
0 0 0 0 3
2 4 0 0 0
0 0 3 0 0

Выход ( Θ ):

5 6 5 1 6
4 8 7 6 2
5 7 7 7 3
2 4 8 8 6
4 1 3 4 3


1
@Arnauld Ты прав; это не верно Меандр - это один замкнутый путь.
Джордан

1
@Arnauld Спасибо, я сделал это изменение. Я не знал, что MathJax был включен на этом сайте!
Джордан

Ответы:


11

JavaScript (ES7),  236 ... 193  185 байт

Выходы путем изменения входной матрицы.

m=>(g=(d,x,y,v,r=m[y],h=_=>++r[x]<9?g(d,x,y,v)||h():r[x]=0)=>r&&1/(n=r[x])?x|y|!v?n?g(d='21100--13203-32-21030321'[n*28+d*3+7&31],x+--d%2,y+--d%2,v+=n<7||.5):h():!m[v**.5|0]:0)(0,0,0,0)

Попробуйте онлайн!

(включает некоторый код постобработки для печати результата как в виде матрицы, так и в виде плоского списка, совместимого с инструментом визуализации, предоставленным OP)

Результаты

Как?

переменные

граммd(Икс,Y)v

грамм

  • р

    r = m[y]
  • час18граммграмм0

    h = _ => ++r[x] < 9 ? g(d, x, y, v) || h() : r[x] = 0

Начальные проверки

N

r && 1 / (n = r[x]) ? ... ok ... : ... failed ...

(0,0)v>0

x | y | !v ? ... no ... : ... yes ...

А пока давайте предположим, что мы не вернулись к исходной точке.

Ищу дорогу

N0час

N0

Ndd

d = '21100--13203-32-21030321'[n * 28 + d * 3 + 7 & 31]

Последние 8 записей недействительны и опущены. Остальные 4 недействительные записи явно помечены дефисами.

Для справки ниже представлены декодированная таблица, компас и набор тайлов, представленные в тесте:

   | 1 2 3 4 5 6 7 8
---+-----------------
 0 | 0 - - 1 3 - 3 1          1
 1 | - 1 - - 2 0 2 0        0 + 2
 2 | 2 - 1 - - 3 1 3          3
 3 | - 3 0 2 - - 0 2

грамм1/2v781

g(d, x + --d % 2, y + --d % 2, v += n < 7 || .5)

dИксY

Проверка пути

(0,0)v>0

781/2v

vзнак равноN2v>N2v<N2ККзнак равноv

Отсюда код JS:

!m[v ** .5 | 0]

Отформатированный источник

m => (
  g = (
    d,
    x, y,
    v,
    r = m[y],
    h = _ => ++r[x] < 9 ? g(d, x, y, v) || h() : r[x] = 0
  ) =>
    r && 1 / (n = r[x]) ?
      x | y | !v ?
        n ?
          g(
            d = '21100--13203-32-21030321'[n * 28 + d * 3 + 7 & 31],
            x + --d % 2,
            y + --d % 2,
            v += n < 7 || .5
          )
        :
          h()
      :
        !m[v ** .5 | 0]
    :
      0
)(0, 0, 0, 0)

Хорошо сделано. Я хотел бы прочитать объяснение кода.
Джордан

@ Арнаулд, ты грубо навязываешь это или используешь другой алгоритм?
Иона

1
@Jonah Я сейчас пишу объяснение. По сути, да, это метод грубой силы, но алгоритм возвращается, как только обнаруживается некоторая несогласованность, а не пробует каждую возможную доску.
Арно
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.