Izgara doldurma kıvrımını tamamlayın


18

Izgara dolgu kıvrımlı bir kare ızgarasının her hücresini en az bir kez ziyaret eden, bitişik hücreler arasında herhangi bir kenarı asla bir kereden fazla geçmeyen ve asla kendini geçmeyen kapalı bir yoldur . Örneğin:N-xN-

Doldurulduktan sonra, ızgaranın her hücresi aşağıdaki 8 döşemeden biri ile temsil edilebilir:

Bu şekilde numaralandırılan, yukarıdaki kıvrımlı karolar bu matrisle temsil edilebilir:

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

Senin görevin eksik bir kiremit seti verilen bir ızgara doldurma menderes tamamlamaktır. Örneğin, eksik menderes:

... 0eksik fayanslar için s kullanılarak temsil edilebilir :

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

... şu şekilde tamamlanabilir:

... yani:

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

Özellikler

  • Giriş her zaman en az ve en fazla (boş olmayan) döşemeye sahip olacaktır, burada .1N-22N-7
  • Cevabınızda belirtildiği sürece, döşemeleri temsil etmek için herhangi bir değer kümesi kullanabilirsiniz.
  • Giriş ve çıktınız, yanıtınızda belirtildiği sürece herhangi bir biçimde ve sırada olabilir.
  • Tüm girişler için en az bir geçerli çözüm olacaktır (yani geçersiz girdiyi işlemenize gerek yoktur).
  • Standart I / O kuralları geçerlidir.
  • Standart boşluklar yasaktır.
  • "Pratik" diller için bile açıklamalar teşvik edilmektedir.

Test senaryoları

Giriş ( Θ ):

0 6
0 0

Çıktı ( Θ ):

5 6
4 3

Giriş ( Θ ):

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

Çıktı ( Θ ):

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

Giriş ( Θ ):

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

Çıktı ( Θ ):

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 Haklısınız; geçerli değil. Menderes kapalı tek bir yoldur.
Ürdün

1
@Arnauld Teşekkürler, bu değişikliği yaptım. MathJax'ın bu sitede etkinleştirildiğini fark etmedim!
Ürdün

Yanıtlar:


11

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

Giriş matrisini değiştirerek çıkış yapar.

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)

Çevrimiçi deneyin!

(sonucu hem matris olarak hem de OP tarafından sağlanan görselleştirme aracıyla uyumlu düz bir liste olarak yazdırmak için bazı işlem sonrası kodları içerir )

Sonuçlar

Nasıl?

Değişkenler

gd(x,y)v

g

  • r

    r = m[y]
  • h18gg0

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

İlk kontroller

n

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

(0,0)v>0

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

Şimdilik, başlangıç ​​noktasına dönmediğimizi varsayalım.

Bir yol arıyorum

n0h

n0

ndd

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

Son 8 giriş geçersiz ve atlanmıştır. Diğer 4 geçersiz giriş açıkça tire ile işaretlenmiştir.

Referans için, aşağıda çözülen tablo, pusula ve meydan okumada sağlanan karo seti verilmiştir:

   | 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

Yolu doğrulama

(0,0)v>0

781/2v

v=N-2v>N-2v<N-2kk=v

Dolayısıyla JS kodu:

!m[v ** .5 | 0]

Biçimlendirilmiş kaynak

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)

İyi iş. Kodun bir açıklamasını okumak isterim.
Ürdün

@Arna zorla veya başka bir algoritma kullanıyor olabilir misiniz?
Jonah

1
@Jonah Şu anda bir açıklama yazıyorum. Temel olarak, evet, bu bir kaba kuvvet yaklaşımıdır, ancak her olası tahtayı denemek yerine bir miktar tutarsızlık tespit edilir edilmez algoritma geri döner.
Arnauld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.