今天闲着无聊,正好用八皇后问题熟悉一下python的基本功。
#Queens --
def checkPlaceOK(queens, curPlace,maxrow):
if len(queens)<=0:
return True
if ( curPlace[0]>=maxrow or curPlace[1]>=maxrow):
return False
for q in queens:
if ( curPlace[0]==q[0] or curPlace[1]==q[1] ):
return False
if ( (q[1]-q[0])==(curPlace[1]-curPlace[0]) or q[0]+q[1]==curPlace[0]+curPlace[1]):
return False
return True
def findNxtQueenPlace(queens,startplace,maxrow):
isok=False
for i in range(startplace[0],maxrow):
for j in range(startplace[1],maxrow):
curPlace=(i,j)
if checkPlaceOK(queens,curPlace,maxrow):
isok=True;break;
if isok:
break
if isok: ## if find the correct place, return the place
return True,curPlace
## else return false
return False,(-1,-1)
def backToPreQueen(queens,maxrow):
if len(queens)<=0:
print "FATAL: NO resolution!!!"
exit("FATAL: NO SOLUTION!!")
lastqueen=queens[len(queens)-1]
del queens[len(queens)-1]
#print "TEst if removed item can be show:",lastqueen
findPlace,place=findNxtQueenPlace(queens, (lastqueen[0],lastqueen[1]+1), maxrow)
if findPlace:
queens.append(place);return;
else:
backToPreQueen(queens,maxrow)
queens=[]
MAXROW=8
iteration=0
while len(queens)<MAXROW:
placeOK,place=findNxtQueenPlace(queens,(0,0),MAXROW)
if placeOK:
queens.append(place)
else:
backToPreQueen(queens,MAXROW)
print "iteration ",iteration,":",queens
iteration+=1
print "Final result : ",queens
经过迭代438次,得到一个可行解