Completa il meandro di riempimento della griglia


18

Un meandro che riempie la griglia è un percorso chiuso che visita ogni cella di una griglia quadrata N×N almeno una volta, senza mai attraversare un bordo tra le celle adiacenti più di una volta e mai attraversando se stesso. Per esempio:

Una volta riempita, ogni cella della griglia può essere rappresentata da una delle seguenti 8 tessere:

Numerate in questo modo, le tessere del meandro sopra possono essere rappresentate da questa matrice:

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

Il tuo compito è completare un meandro di riempimento della griglia dato un set incompleto di tessere. Ad esempio, il meandro incompleto:

... che può essere rappresentato usando 0s per le tessere mancanti:

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

... potrebbe essere completato in questo modo:

... vale a 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

specificazioni

  • L'ingresso avrà sempre almeno 1 e al massimo riquadriN2 (non vuoti), dove 2N7 .
  • È possibile utilizzare qualsiasi set di valori per rappresentare i riquadri, purché sia ​​specificato nella risposta.
  • L'input e l'output possono essere in qualsiasi formato e ordine, purché sia ​​specificato nella risposta.
  • Esisterà almeno una soluzione valida per tutti gli input (ovvero non è necessario gestire input non validi).
  • Si applicano le regole I / O standard .
  • Sono vietate le scappatoie standard .
  • Le spiegazioni, anche per le lingue "pratiche", sono incoraggiate.

Casi test

Ingresso ( Θ ):

0 6
0 0

Uscita ( Θ ):

5 6
4 3

Ingresso ( Θ ):

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

Uscita ( Θ ):

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

Ingresso ( Θ ):

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

Uscita ( Θ ):

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 Hai ragione; non è valido Un meandro è un singolo percorso chiuso.
Giordania,

1
@Arnauld Grazie, ho apportato questa modifica. Non avevo capito che MathJax era abilitato su questo sito!
Giordania,

Risposte:


11

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

Emette modificando la matrice di input.

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)

Provalo online!

(include un codice di post-elaborazione per stampare il risultato sia come matrice che come lista piatta compatibile con lo strumento di visualizzazione fornito dall'OP)

risultati

Come?

variabili

gd(X,y)v .

g

  • r

    r = m[y]
  • h18gg0

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

Controlli iniziali

n

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

(0,0)v>0

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

Per ora, supponiamo che non siamo tornati al punto di partenza.

Alla ricerca di un percorso

n0h

n0

ndd

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

Le ultime 8 voci non sono valide e omesse. Le altre 4 voci non valide sono esplicitamente contrassegnate con trattini.

Per riferimento, di seguito sono riportati la tabella decodificata, la bussola e il set di tessere forniti nella sfida:

   | 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/2v781

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

dXy , costringendo la prossima iterazione a fallire immediatamente.

Convalida del percorso

(0,0)v>0 , ciò non significa necessariamente che abbiamo trovato un percorso valido, in quanto potremmo aver preso una scorciatoia. Dobbiamo verificare se abbiamo visitato il numero corretto di celle.

781/2v quando tale tessera viene visitato.

v=N2v>N2v<N2KK=v

Da qui il codice JS:

!m[v ** .5 | 0]

Fonte formattata

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)

Bel lavoro. Mi piacerebbe leggere una spiegazione del codice.
Giordania,

@Arnauld stai forzando brutalmente o usando un altro algoritmo?
Giona il

1
@Jonah Attualmente sto scrivendo una spiegazione. Fondamentalmente, sì, è un approccio a forza bruta ma l'algoritmo fa marcia indietro non appena viene rilevata un'incoerenza piuttosto che provare ogni singola scheda.
Arnauld
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.