我碰到這個問題,其中8個皇后應該放在一個棋盤,使得沒有人能殺死每個other.This來到我就是試圖解決這個問題:8皇后棋盤| PYTHON |內存錯誤
import itertools
def allAlive(position):
qPosition=[]
for i in range(8):
qPosition.append(position[2*i:(2*i)+2])
hDel=list(qPosition) #Horizontal
for i in range(8):
a=hDel[0]
del hDel[0]
l=len(hDel)
for j in range(l):
if a[:1]==hDel[j][:1]:
return False
vDel=list(qPosition) #Vertical
for i in range(8):
a=vDel[0]
l=len(vDel)
for j in range(l):
if a[1:2]==vDel[j][1:2]:
return False
cDel=list(qPosition) #Cross
for i in range(8):
a=cDel[0]
l=len(cDel)
for j in range(l):
if abs(ord(a[:1])-ord(cDel[j][:1]))==1 and abs(int(a[1:2])-int(cDel[j][1:2]))==1:
return False
return True
chessPositions=['A1','A2','A3','A4','A5','A6','A7','A8','B1','B2','B3','B4','B5','B6','B7','B8','C1','C2','C3','C4','C5','C6','C7','C8','D1','D2','D3','D4','D5','D6','D7','D8','E1','E2','E3','E4','E5','E6','E7','E8','F1','F2','F3','F4','F5','F6','F7','F8','G1','G2','G3','G4','G5','G6','G7','G8','H1','H2','H3','H4','H5','H6','H7','H8']
qPositions=[''.join(p) for p in itertools.combinations(chessPositions,8)]
for i in qPositions:
if allAlive(i)==True:
print(i)
回溯(最近最後一次通話):
qPositions = [ '' 加入(p)對於p在itertools.combinations(chessPositions,8)]
的MemoryError
我還是個新手。我該如何克服這個錯誤?還是有更好的方法來解決這個問題?
它可以通過嘗試和_backtracking_解決,直到找到一個有效的解決方案(暗示遞歸) –
每個字符串像「」A1「'是2個字節的大小。 2 * 4426165368> 8Gb。除非一個人擁有更多的10GB內存,或者不以某種特殊的方式使用某種交換方式,否則他無法計算該陣列。既然他說他是Python的新手,我認爲他不能做任何上述的描述。當然,這可以通過做一些生病的編程的東西來完成,但我懷疑他的課程是關於這個的;) – campovski
10GB或RAM以及大量的CPU功率。 10GB的ram在企業服務器上很常見,但填滿陣列的時間太多了。 –