八皇后问题python实现_八皇后问题的python实现
以前寫的一個八皇后問題求解,思路就是每次循環列出所有的可能解,然后過濾出不符合要求的解。詳細見代碼:
//檢查兩個點是否在攻擊線上
def attack(p1,p2):
return p1[0]==p2[0] or p1[1] == p2[1] or (abs(p1[0]-p2[0])==abs(p1[1]-p2[1]))
//棋盤類
class Cell():
def __init__(self,n):
self.n = n
self.cell = [[(i,j) for j in range(n)] for i in range(n)]
def isAttack(p,rp):
for i in rp:
if attack(p,i):
return True
return False
def eightQueen(num):
cell = Cell(num)
board = cell.cell
result = [[(0,i)] for i in range(num)]
count = 0
for col in board:
count+=1
for p in col:
if not result:
result.append([p])
else:
#scan the result
for rp in result:
if not isAttack(p,rp):
copy = rp[:]
copy.append(p)
result.append(copy)
result = filter(lambda x: x.__len__()==count,result)
return filter(lambda x : x.__len__()==num,result)
//使用方式如下,返回所有的有效解
result = eightQueen(8)
下面是同事的遞歸方式的解決方案
class EightQueen:
#define const queen number
queenNum = 8
def __init__(self):
#定義一個8行 8 列的二維數組來模擬棋盤
self.qiPan = []
self.num = 0
#init a n*n list[][] as qi pan
for i in range(self.queenNum):
rows = []
for j in range(self.queenNum):
xy = [i,j]
rows.append(xy)
self.qiPan.append(rows)
#定義一個遞歸方法,遞歸去下一行尋找符合條件的坐標點
#param e8 存放符合條件的坐標點的列表
#param rowNum 尋找的行號
def getNext(self,e8,rowNum):
if len(e8) == self.queenNum:
self.num += 1
#輸出符合條件的全部坐標點
print "method "+str(self.num)+"is:"+str(e8)
return
if rowNum > len(self.qiPan):
return
for d in self.qiPan[rowNum]:
if self.matchAllE8(e8,d):
e8copy = e8[:]
e8copy.append(d)
self.getNext(e8copy,rowNum+1)
def calcNum(self):
#遍歷棋盤的第一行
for i in self.qiPan[0]:
#從第二行開始遞歸尋找符合條件的坐標
self.getNext([i],1)
print "all method is:"+str(self.num)
#判斷left0坐標 是否滿足上面行中已找到的全部符合條件的坐標都不攻擊
def matchAllE8(self,e8,left0):
for i in e8:
if not self.isMatch(i,left0):
return False
return True
# 符合不攻擊的條件
def isMatch(self,f,g):
return (f[0]+f[1] != g[0]+g[1]) and\
(f[0]-f[1] != g[0]-g[1]) and\
(f[0] != g[0]) and (f[1] != g[1])
e = EightQueen()
e.calcNum()
總結
以上是生活随笔為你收集整理的八皇后问题python实现_八皇后问题的python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pyqt5 窗体自适应_P
- 下一篇: 填谷式无源pfc电路_有源PFC电路上各