由元组表示皇后的位置。每个元组中元素指示相应行的皇后的位置(也就是列)。例如:如果state[0] == 3,就表示,第一个皇后位于棋盘的第1行的第4列。state中存储的是皇后的“列”位置信息。如:state=(1,3,0),即:state[0]=1,state[1]=3,state[2]=0,第1个皇后位于1行2列,第2个皇后位于2行4列,第3个皇后位于3行1列,也就是说,state存储的是皇后的 “列”信息,“索引参数”是行信息。
先附上实现八皇后的代码,下来分部来理解学习。
def conflict(state,nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0,nextY-i):
return True
return False
def queens(num=8,state=()):
for pos in range(num):
if not conflict(state,pos):
if len(state) == num-1:
yield (pos,)
else:
for result in queens(num, state + (pos,)):
yield (pos,) + result
def prettyprint(solution):
def line(pos,length = len(solution)):
return '. '*pos + '* ' + '. '*(length - pos - 1)
for pos in solution:
print(line(pos))
调用:
import random
prettyprint(random.choice(list(queens(8))))
二、判断下一个的皇后的位置会不会有冲突
#1.conflict(state,nextX)
#有冲突:Ture,无冲突:False
def conflict(state,nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0,nextY-i):
return True
return Fals
什么是冲突?
新的皇后与之前的皇后 同列,同行,同对角线为冲突信息。从冲突想办法转换为数学关系式:
根据我自身学习遇到的困难,为了更好的理解代码,现用4皇后来说明上述代码。
conflict函数中理解:
if abs(state[i]-nextX) in (0,nextY-i):
是关键,首先明确state[i],nextX,nextY,i的含义。为了更好的说明,结合下面的代码(已知前n-1皇后的位置,如何确定最一个(第n个)皇后的位置):
def queens(num,state):
if len(state) == num-1:
for pos in range(num):
if not conflict(state,pos):
yield pos
以4皇后问题来说明 if abs(state[i]-nextX) in (0,nextY-i): 代码,如图:
前3个皇后位置已经确定,“列”信息以元组的形式(1,3,0)存储。获得第4个皇后位置调用语句:
list(queens(4,(1,3,0)))
yield pos,返回的是列的值,输出[ 2 ],3行(前3个皇后已经确定,现在是确定最后一个皇后的位置)2列