Розв’яжіть 8 головоломки


13

8 головоломки - це менший варіант головоломки 15 (або розсувної головоломки ). У вас є 3x3сітка, яка заповнена цифрами від 0-8 (0 позначає порожню плитку), розташованою у випадковому порядку. Ваше завдання - ввести сітку 3х3 і показати найкоротше рішення (мінімальні ходи), щоб дійти до стану мети. Відобразить кожну державну плату, включаючи перший стан у висновку.

Можливо, існує кілька оптимальних рішень, просто потрібно роздрукувати його.

Введення: (невеликий приклад)

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-9бути grid which is filled with numbers from 0-8?
Клайд Лобо

@Clyde, На жаль! :) Виправлено.
st0le

Досить впевнений, що завжди можна вирішити, правда?
Magic Octopus Urn

@MagicOctopusUrn Якщо ви дійшли до початкового стану з цільового стану, використовуючи правила ковзання, це завжди вирішимо. Якщо ви довільно вкладаєте плитки, то є стани, які неможливо вирішити. Google for
Solvability

Відповіді:


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.