그리드 채우기 구불 구불 완료


18

그리드-채움 구불 구불 한 사각형은 한 이상 정사각형 격자 의 모든 셀을 방문하고 , 인접한 셀 사이의 가장자리를 두 번 이상 교차하지 않으며 자신을 절대로 교차하지 않는 닫힌 경로입니다 . 예를 들면 다음과 같습니다.N×N

채워지면 그리드의 각 셀은 다음 8 개의 타일 중 하나로 표시 될 수 있습니다.

이 방법으로 번호를 매기면, 위의 meander의 타일은이 행렬로 표현 될 수 있습니다 :

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

당신의 임무는 불완전한 타일 세트가 주어지면 그리드 채움 구불 구불을 완성하는 것입니다. 예를 들어, 불완전한 구불 구불 한 :

... 0없는 타일에 대해 s를 사용하여 나타낼 수 있습니다 .

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

명세서

  • 입력은 항상 최소 그리고 최대 (비어 있지 않은) 타일을 갖습니다 . 여기서 입니다.1N22N7
  • 답변에 지정된 경우 타일을 나타 내기 위해 모든 값 집합을 사용할 수 있습니다.
  • 귀하의 입력과 출력은 귀하의 답변에 명시된 한 어떤 형식과 순서로도 가능합니다.
  • 모든 입력에 대해 하나 이상의 유효한 솔루션이 존재합니다 (즉, 유효하지 않은 입력을 처리 할 필요가 없습니다).
  • 표준 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
@Arnauld 감사합니다, 나는 그 변화를 만들었습니다. 이 사이트에서 MathJax가 활성화 된 것을 몰랐습니다!
요르단

답변:


11

자바 스크립트 (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 = m[y]
  • h180

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

초기 점검

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

(0,0)V>0

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

지금은 시작점으로 돌아 가지 않았다고 가정 해 봅시다.

경로를 찾고

0h

0

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

1/2V781

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

엑스와이

경로 확인

(0,0)V>0

781/2V

V=2V>2V<2케이케이=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.