ไขปริศนา 8 อัน


13

8 Puzzle เป็นตัวแปรที่เล็กกว่าของ 15Puzzle (หรือปริศนาตัวต่อ ) คุณมี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-9จะเป็นgrid which is filled with numbers from 0-8?
ไคลด์ Lobo

@ ไคลด์อ๊ะ! :) แก้ไขแล้ว.
st0le

ค่อนข้างแน่ใจว่ามันเป็นไปได้เสมอที่จะแก้ปัญหาใช่มั้ย
Magic Octopus Urn

@MagicOctopusUrn หากคุณมาถึงสถานะเริ่มต้นจากสถานะเป้าหมายโดยใช้กฎการเลื่อนจะสามารถแก้ไขได้เสมอ หากคุณวางกระเบื้องโดยพลการมีสถานะที่ไม่สามารถแก้ไขได้ Google เพื่อการแก้ปัญหาสำหรับปริศนา n
2560

คำตอบ:


5

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