Завершіть меандр, що заповнює сітку


18

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

Після заповнення кожна комірка сітки може бути представлена ​​однією з наступних 8 плиток:

Пронумеровані таким чином, плитки вищезгаданого меандру можуть бути представлені цією матрицею:

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

Ваше завдання - скласти меандр, що заповнює сітку, отримавши неповний набір плиток. Наприклад, неповний меандр:

... які можна представити за допомогою 0 s для відсутніх плиток:

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)

Спробуйте в Інтернеті!

(включає деякий код після обробки після друку результату як матриця, так і як плоский список, сумісний із засобом візуалізації наданим ОП)

Результати

Як?

Змінні

гг(х,у)v .

г

  • r

    r = m[y]
  • год18гг0

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

Початкові перевірки

н

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

(0,0)v>0

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

На даний момент припустимо, що ми не повернулися до вихідної точки.

Шукаєте шлях

н0год

н0

нгг

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)

гху , змушуючи негайно наступну ітерацію.

Перевірка шляху

(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)

Хороша робота. Я хотів би прочитати пояснення коду.
Йорданія

@Arnauld ти жорстоко змушуєш це чи використовуєш інший алгоритм?
Іона

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