上一版程序当中,通过检查全部棋盘来判断冲突,效率低下,代码冗长,而且容易出错。
参考书上的代码,判断冲突的时候,只需要针对已经摆好的皇后和本次摆放的皇后挨个比较:
如果两者,在横轴(列)的数据之差等于0,则说明在同一列,如果等于两者在纵轴(行)之差,则说明在对角线上。
至于是否在同一行上面,代码在逻辑上进行了处理,如果一行摆了皇后,则往下一行再摆,从而避免了在同一行。
优化后的代码,简洁明快,令人拍案叫绝。而且效率是全比较的10倍!!!!
#encoding:utf-8
import copy
def initBorad():
board=[];
for _ in range(8):
x=map( lambda x:x-x,range(8) )
board.append(x)
return board
def checkAttackX(lx,ij):
for x in lx:
if abs(ij[1]-x[1]) in (0,abs(ij[0]-x[0])):
return True;
return False;
def eightQueen():
board=initBorad()
allBoard=[]
stack=[]
i=j=0
try:
while True:
while i < len(board):
found=False
while j < len(board):
board[i][j]=1
if (checkAttackX(stack,(i,j))==True):
board[i][j]=0
j+=1
else:
stack.append((i,j))
found=True
i+=1
j=0
break
if found==False:
i,j=stack.pop()
board[i][j]=0
j+=1
allBoard.append(board)
board=copy.deepcopy(board)
i,j=stack.pop()
board[i][j]=0
j+=1
except (Exception) as e:
print "八皇后摆放完毕"
return allBoard
x=eightQueen()
count=0
for ie in x:
count+=1
print "\n解法:"+str(count)
for ii in ie:
print ii