8 퍼즐 풀기


13

8 퍼즐은 15 퍼즐 (또는 슬라이딩 퍼즐 ) 의 작은 변형입니다 . 당신은이 3x3임의의 순서로 배열 0-8 (0 나타냅니다 빈 타일)에서 숫자로 가득 격자. 당신의 임무는 3x3 그리드를 입력하고 목표 상태에 도달하기위한 가장 짧은 솔루션 (최소 이동)을 표시하는 것입니다. 출력에서 첫 번째 상태를 포함하여 각 보드 상태를 표시합니다.

최적의 솔루션이 여러 개있을 수 있으므로 하나만 인쇄하면됩니다.

입력 : (작은 예)

1 2 0
4 5 3
7 8 6

산출:

2 <- denotes minimum number of moves required
1 2 0
4 5 3
7 8 6

1 2 3
4 5 0
7 8 6

1 2 3
4 5 6
7 8 0 <- goal state

퍼즐을 풀 수 없으면 인쇄 -1만하십시오 (해결 불가능 함을 나타냄)

편집 : 시간 제한 : <30 초.


npuzzle에 익숙하지 않은 사람들을 위해 제공된 링크를 읽으십시오.
st0le

귀하의 질문에,하지 말아야 grid which is filled with numbers from 0-9grid which is filled with numbers from 0-8?
Clyde Lobo

@ 클라이드, 죄송합니다! :) 수정되었습니다.
st0le

항상 해결할 수 있다는 것을 확신하십시오.
매직 문어 Urn

@MagicOctopusUrn 슬라이딩 규칙을 사용하여 목표 상태에서 초기 상태에 도달 한 경우 항상 해결할 수 있습니다. 임의로 타일을 넣으면 해결할 수없는 상태가 있습니다. n 퍼즐을위한 Google for Solvability
st0le

답변:


5

파이썬, 418 자

이 코드는 모든 위치를 철저하게 열거하고 깊이 (D)와 해결 된 위치 (E)에 가까운 위치의 맵을 만듭니다. 그런 다음 목표 상태를 찾아 출력을 얻습니다.

D={(1,2,3,4,5,6,7,8,0):0}
E=D.copy()
def Z(a,d):
 b=list(a);b[i],b[i+d]=b[i+d],0;b=tuple(b)
 if b not in E:E[b]=a;D[b]=D[a]+1
for x in' '*32:
 for a in E.copy():
  i=list(a).index(0)
  if i>2:Z(a,-3)
  if i%3:Z(a,-1)
  if i%3<2:Z(a,1)
  if i<6:Z(a,3)
g=[]
for x in' '*3:g+=map(int,raw_input().split())
g=tuple(g)
if g in E:
 print D[g]
 while g:
  for i in(0,3,6):print'%d %d %d'%g[i:i+3]
  g=E[g];print
else:print -1

' '*3트릭 처럼 .
st0le
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.