Terminez le méandre de remplissage de la grille


18

Un méandre remplissant une grille est un chemin fermé qui visite chaque cellule d'une grille carrée au moins une fois, ne traversant jamais aucun bord entre des cellules adjacentes plus d'une fois et ne se croisant jamais. Par exemple:N×N

Une fois remplie, chaque cellule de la grille peut être représentée par l'une des 8 tuiles suivantes:

Numérotées de cette façon, les tuiles du méandre ci-dessus peuvent être représentées par cette matrice:

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

Votre tâche consiste à terminer un méandre remplissant la grille étant donné un ensemble incomplet de tuiles. Par exemple, le méandre incomplet:

... qui peut être représenté à l'aide de 0s pour les tuiles manquantes:

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

... pourrait être complété comme ceci:

...c'est à dire:

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

Caractéristiques

  • L'entrée aura toujours au moins et au plus tuiles (non vides), où .1N22N7
  • Vous pouvez utiliser n'importe quel ensemble de valeurs pour représenter les tuiles, tant qu'il est spécifié dans votre réponse.
  • Vos entrées et sorties peuvent être dans n'importe quel format et ordre, tant qu'elles sont spécifiées dans votre réponse.
  • Au moins une solution valide existera pour toutes les entrées (c'est-à-dire que vous n'avez pas besoin de gérer les entrées non valides).
  • Les règles d'E / S standard s'appliquent.
  • Les failles standard sont interdites.
  • Des explications, même pour les langues "pratiques", sont encouragées.

Cas de test

Entrée ( Θ ):

0 6
0 0

Sortie ( Θ ):

5 6
4 3

Entrée ( Θ ):

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

Sortie ( Θ ):

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

Entrée ( Θ ):

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

Sortie ( Θ ):

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 Vous avez raison; ce n'est pas valable. Un méandre est un seul chemin fermé.
Jordan

1
@Arnauld Merci, j'ai fait ce changement. Je ne savais pas que MathJax était activé sur ce site!
Jordan

Réponses:


11

JavaScript (ES7),  236 ... 193  185 octets

Sorties en modifiant la matrice d'entrée.

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)

Essayez-le en ligne!

(comprend un code de post-traitement pour imprimer le résultat à la fois sous forme de matrice et de liste plate compatible avec l' outil de visualisation fourni par l'OP)

Résultats

Comment?

Variables

g(X,y)v

g

  • r

    r = m[y]
  • h18gg0

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

Vérifications initiales

n

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

(0,0)v>0

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

Pour l'instant, supposons que nous ne sommes pas revenus au point de départ.

À la recherche d'un chemin

n0h

n0

n

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

Les 8 dernières entrées sont invalides et omises. Les 4 autres entrées invalides sont explicitement marquées par des tirets.

Pour référence, voici le tableau décodé, la boussole et le jeu de tuiles fournis dans le défi:

   | 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

g1/2vsept81

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

Xy

Validation du chemin

(0,0)v>0

sept81/2v

v=N2v>N2v<N2kk=v

D'où le code JS:

!m[v ** .5 | 0]

Source formatée

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)

Bon travail. J'adorerais lire une explication du code.
Jordan

@Arnauld le forcez-vous brutalement ou utilisez-vous un autre algorithme?
Jonah

1
@Jonah J'écris actuellement une explication. Fondamentalement, oui, c'est une approche par force brute, mais l'algorithme revient en arrière dès qu'une incohérence est détectée plutôt que d'essayer chaque carte possible.
Arnauld
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.