กรอกคดเคี้ยวกรอกตาราง


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 7
  • คุณอาจใช้ชุดของค่าใด ๆ เพื่อเป็นตัวแทนของกระเบื้องตราบใดที่มันระบุไว้ในคำตอบของคุณ
  • อินพุตและเอาท์พุตของคุณอาจอยู่ในรูปแบบและคำสั่งใด ๆ ตราบใดที่คำตอบของคุณระบุไว้
  • จะมีโซลูชันที่ถูกต้องอย่างน้อยหนึ่งรายการสำหรับอินพุตทั้งหมด (เช่นคุณไม่จำเป็นต้องจัดการอินพุตที่ไม่ถูกต้อง)
  • ใช้กฎ I / O มาตรฐาน
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • สนับสนุนการอธิบายแม้สำหรับภาษา "เชิงปฏิบัติ"

กรณีทดสอบ

อินพุต ( Θ ):

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
@Annauld ขอบคุณฉันได้ทำการเปลี่ยนแปลงที่ ฉันไม่ทราบว่า 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)

ผล

อย่างไร?

ตัวแปร

gd(x,y)v

g

  • r

    r = m[y]
  • h18gg0

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

สำหรับตอนนี้สมมติว่าเราไม่ได้กลับไปที่จุดเริ่มต้น

กำลังมองหาเส้นทาง

n0h

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

g1/2v781

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

dxy

กำลังตรวจสอบเส้นทาง

(0,0)v>0

781/2v

v=N2v>N2v<N2kk=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 ฉันกำลังเขียนคำอธิบาย โดยทั่วไปใช่มันเป็นวิธีที่โหดเหี้ยม แต่อัลกอริธึมย้อนกลับเร็ว ๆ นี้เมื่อตรวจพบความไม่สอดคล้องกันบางอย่างแทนที่จะลองแต่ละบอร์ดที่เป็นไปได้
Arnauld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.