Hoàn thành phần uốn lưới


18

Một uốn khúc lấp đầy lưới là một đường dẫn khép kín truy cập vào mọi ô của ô vuông ít nhất một lần, không bao giờ vượt qua bất kỳ cạnh nào giữa các ô liền kề nhiều lần và không bao giờ vượt qua chính nó. Ví dụ:N×N

Sau khi điền, mỗi ô của lưới có thể được biểu thị bằng một trong 8 ô sau:

Được đánh số theo cách này, các ô của phần uốn khúc trên có thể được biểu diễn bằng ma trận này:

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

Nhiệm vụ của bạn là hoàn thành một vòng quanh lấp đầy lưới được cung cấp một bộ gạch không hoàn chỉnh. Ví dụ: phần uốn khúc không hoàn chỉnh:

... có thể được biểu diễn bằng 0s cho các ô bị thiếu:

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

... có thể được hoàn thành như thế này:

...I E:

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

Thông số kỹ thuật

  • Đầu vào sẽ luôn có ít nhất và nhiều nhất là các ô (không trống), trong đó .1N22N7
  • Bạn có thể sử dụng bất kỳ bộ giá trị nào để thể hiện các ô, miễn là nó được chỉ định trong câu trả lời của bạn.
  • Đầu vào và đầu ra của bạn có thể ở bất kỳ định dạng và thứ tự nào, miễn là nó được chỉ định trong câu trả lời của bạn.
  • Ít nhất một giải pháp hợp lệ sẽ tồn tại cho tất cả các đầu vào (nghĩa là bạn không cần xử lý đầu vào không hợp lệ).
  • Quy tắc I / O tiêu chuẩn được áp dụng.
  • Sơ hở tiêu chuẩn bị cấm.
  • Giải thích, ngay cả đối với các ngôn ngữ "thực tế", được khuyến khích.

Các trường hợp thử nghiệm

Đầu vào ( Θ ):

0 6
0 0

Đầu ra ( Θ ):

5 6
4 3

Đầu vào ( Θ ):

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

Đầu ra ( Θ ):

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

Đầu vào ( Θ ):

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 ra ( Θ ):

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 Bạn đã đúng; nó không hợp lệ Một khúc quanh là một con đường khép kín duy nhất.
Jordan

1
@Arnauld Cảm ơn, tôi đã thực hiện thay đổi đó. Tôi đã không nhận ra MathJax đã được kích hoạt trên trang web này!
Jordan

Câu trả lời:


11

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

Đầu ra bằng cách sửa đổi ma trận đầu vào.

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)

Hãy thử trực tuyến!

(bao gồm một số mã xử lý hậu kỳ để in kết quả cả dưới dạng ma trận và dưới dạng danh sách phẳng tương thích với công cụ trực quan do OP cung cấp)

Các kết quả

Làm sao?

Biến

gd(x,y)v

g

  • r

    r = m[y]
  • h1số 8gg0

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

Kiểm tra ban đầu

n

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

(0,0)v>0

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

Hiện tại, hãy giả sử rằng chúng tôi không trở lại điểm xuất phát.

Tìm kiếm một con đường

n0h

n0

ndd

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

8 mục cuối không hợp lệ và bị bỏ qua. 4 mục không hợp lệ khác được đánh dấu rõ ràng bằng dấu gạch nối.

Để tham khảo, bên dưới là bảng được giải mã, la bàn và bộ gạch được cung cấp trong thử thách:

   | 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/2v7số 81

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

dxy

Xác thực đường dẫn

(0,0)v>0

7số 81/2v

v= =N2v>N2v<N2kk= =v

Do đó mã JS:

!m[v ** .5 | 0]

Nguồn định dạng

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)

Công việc tốt đẹp. Tôi rất thích đọc một lời giải thích về mã.
Jordan

@Arnauld bạn có đang cưỡng bức nó hoặc sử dụng thuật toán khác không?
Giô-na

1
@Jonah Tôi hiện đang viết một lời giải thích. Về cơ bản, vâng, đó là một cách tiếp cận mạnh mẽ nhưng thuật toán quay lại ngay khi phát hiện ra sự không nhất quán thay vì thử từng bảng một.
Arnauld
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.