八數碼遊戲就是通過移動空格把數字從給定的狀態移動到目標狀態,例如:
初始狀態為 目標狀態為程式中用0表示空格,提供了兩套狀態。2 8 3 1 2 3
1 6 4 8 4
7 5 7 6 5
eightnums.rb
class eightnums
#常量定義
up = 1
down = -1
left = 2
right = -2
row = 0
col = 1
#初始化
@@initstat = [[2,8,3], [1,6,4], [7,0,5]] #初始狀態
@@targetstat = [[1,2,3], [8,0,4], [7,6,5]] #目標狀態
@@stat = [[2,8,3], [1,6,4], [7,0,5]] #初始狀態
@@zeropos = [2, 1] #0的位置
# @@initstat = [[2,0,3], [1,4,5], [6,7,8]] #初始狀態
# @@targetstat = [[1,2,3], [4,0,5], [6,7,8]] #目標狀態
# @@stat = [[2,0,3], [1,4,5], [6,7,8]] #初始狀態
# @@zeropos = [0, 1] #0的位置
def run()
puts "initial status:"
printstat(@@initstat)
min = getvalue(@@stat)
puts "target status:"
printstat(@@targetstat)
puts "initial value: #",' '
steps = 0
lastmove = -1 #記錄上次移動方向,避免反覆
while steps < 10 do
flag = false #是否找到比min小的值
#尋找最小值,確定移動方向
direction = up
[up, down, left, right].each do
|i|val = trymoving(i)
if val != -1
if val < min && i != -lastmove then
min = val
flag = true
direction = i
endend
end#移動
movezero(direction)
lastmove = direction
printstat(@@stat)
puts "current value: #"
if !flag
min = getvalue(@@stat)
endsteps += 1
break if getvalue(@@stat) == 0
endend
private
def getvalue(status)
value = 0
for row in 0..2 do
for col in 0..2 do
if status[row][col] != @@targetstat[row][col]
value += 1
endend
endreturn value
end#移動0
def movezero(direction)
case direction
when up #上移
if @@zeropos[row] != 0
@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row] - 1][@@zeropos[col]]
@@stat[@@zeropos[row] - 1][@@zeropos[col]] = 0
@@zeropos[row] -= 1
else
return -1
endwhen down #下移
if @@zeropos[row] != 2
@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row] + 1][@@zeropos[col]]
@@stat[@@zeropos[row] + 1][@@zeropos[col]] = 0
@@zeropos[row] += 1
else
return -1
endwhen left #左移
if @@zeropos[col] != 0
@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row]][@@zeropos[col] - 1]
@@stat[@@zeropos[row]][@@zeropos[col] - 1] = 0
@@zeropos[col] -= 1
else
return -1
endwhen right #右移
if @@zeropos[col] != 2
@@stat[@@zeropos[row]][@@zeropos[col]] = @@stat[@@zeropos[row]][@@zeropos[col] + 1]
@@stat[@@zeropos[row]][@@zeropos[col] + 1] = 0
@@zeropos[col] += 1
else
return -1
endend
return 0
end#列印狀態
def printstat(status)
3.times
end#嘗試移動,移動不成功則返回-1
def trymoving(direction)
success = movezero(direction)
if success == 0
value = getvalue(@@stat)
movezero(-direction)
return value
else
return -1
endend
endnum = eightnums.new
num.run()
八數碼遊戲的Ruby實現
八數碼遊戲就是通過移動空格把數字從給定的狀態移動到目標狀態,例如 初始狀態為 目標狀態為 2 8 3 1 2 3 1 6 4 8 4 7 5 7 6 5 程式中用0表示空格,提供了兩套狀態。eightnums.rb class eightnums 常量定義 up 1 down 1 left 2 ri...
簡單的八數碼問題(BFS)
時間限制 1 sec 記憶體限制 256 mb 提交 9 解決 7 提交 狀態 討論版 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有一個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始佈局 初始狀態 和目標佈局 為了使題目簡單,設目標狀態...
八數碼問題的A 演算法求解
a 演算法是啟發式搜素演算法中較為出名和高效的演算法之一,其關鍵是對於啟發式函式的實際,啟發式函式h x 需要儘可能的接近實際的h x h x 下面是人工智慧八數碼問題使用a 演算法求解的原始碼放在部落格上記錄一下。程式使用放錯位置的棋子的個數作為啟發式函式。include include incl...
八數碼問題的幾種解法
1.用雙向bfs解決八數碼問題 2.用迭代加深搜的a 演算法解決八數碼問題 注 本實驗我採用的都是從283104765到123804765的最短步數 首先,雙向bfs指的是從初始狀態和目標狀態同時開始搜尋,廣度優先搜尋是每次先搜尋周圍,然後再向外擴充套件,這裡我們把矩陣轉化為數字序列,更方便 我將用...
八數碼遊戲分析 原始碼 啟發式搜尋(一)
八數碼問題 圖1.1 左邊為開始格局,右邊為移動後最終格局 圖1.2 如果按正常的思維,採用盲目搜尋的話,不僅搜尋的次數多,而且往往容易陷入死迴圈中,所以面對此問題需要一種策略 啟發式搜尋 啟發式搜尋 啟發式搜尋就是在狀態空間中的搜尋對每一個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直...