Python深度優先解決八數碼問題

2021-10-25 05:58:52 字數 3174 閱讀 9824

在寬度優先解決八數碼問題基礎上對節點類增加深度屬性

import copy

import numpy as np

from datetime import datetime

# 字串列表化

defstring_to_ls

(str):

return

[i.split(

' ')

for i in

str.split(

',')

]# 獲取位置

defget_loacl

(arr, target)

:# r, c = np.where(arr == target)

# return r, c

for i in arr:

for j in i:

if j == target:

return arr.index(i)

, i.index(j)

# 獲取可以和0交換位置的元素

defget_elements

(arr)

: r, c = get_loacl(arr,

'0')

elements =

if r >0:

1][c])

# 上面的元素

if r <2:

1][c])

# 下邊的元素

if c >0:

[c -1]

)# 左面的元素

if c <2:

[c +1]

)# 右面的元素

return elements

defget_child

(arr, e)

:# 深拷貝與淺拷貝!!

arr_new = copy.deepcopy(arr)

r, c = get_loacl(arr_new,

'0')

r1, c1 = get_loacl(arr_new, e)

arr_new[r]

[c], arr_new[r1]

[c1]

= arr_new[r1]

[c1]

, arr_new[r]

[c]return arr_new

defis_goal

(arr, goal)

:return arr == goal

class

state

:def

__init__

(self, state, deep, parent)

:# state是乙個3x3的ls矩陣

self.state = state

self.deep = deep

self.parent = parent

defchidren

(self)

: chidren =

for i in get_elements(self.state)

: child = state(state=get_child(self.state, i)

, deep=self.deep +

1, parent=self)

return chidren

# 列印求解路徑

defprint_path

(n):

if n.parent ==

none

:return

else

:print

('↑'

)print

(np.array(n.parent.state)

) print_path(n.parent)

if __name__ ==

'__main__'

:# initial = '0 1 3,4 2 5,7 8 6'

# goal = '4 1 3,7 0 5,8 2 6'

# initial = '0 7 8,2 5 4,3 6 1'

# goal = '7 5 8,2 4 1,3 6 0'

initial =

'4 0 1,6 8 5,7 3 2'

goal =

'5 8 2,1 0 4,6 3 7'

initial_arr = state(string_to_ls(initial)

, deep=

0, parent=

none

) goal_arr = string_to_ls(goal)

start = datetime.now(

)open

=[initial_arr]

close =

# limit = eval(input('請輸入要搜尋的深度:'))

limit =

20while

len(

open

)>0:

open_tb =

[i.state for i in

open

] close_tb =

[i.state for i in close]

n =open

.pop(0)

if is_goal(n.state, goal_arr)

:print

(np.array(n.state)

) print_path(n)

print

('求解過程如上'

)break

else

:if n.deep < limit:

for i in n.chidren():

if i.state not

in open_tb:

if i not

in close_tb:

open

.insert(

0, i)

else

:print

('該深度下無解'

) end = datetime.now(

)print

('深度為{}下的搜尋步數為:{}'

.format

(close[-1

].deep,

len(close)-2

))print

('共耗時:'

, end - start)

廣度優先搜尋解決八數碼問題

程式描述 基於盲目搜尋策略的寬度優先搜尋方法 include include include include include include include using namespace std define n 9 九宮格總數字 陣列定義 0 9階乘定義 const int jc n 1 0 9...

八數碼寬度優先演算法

相關 要感謝網上的一些大神給予的分享 用來作為乙個結點的資料結構。struct map 用來列印乙個結點 cout函式用來擴充套件乙個結點的後繼結點 上 下 左 右 if hasgetblankcell break 移動數字,t i,t j為移動後0的座標 int t i i,t j j bool ...

深度優先搜尋解決八皇后問題

八皇后問題是什麼 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌...