在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
一 递归解法
def conflict(state,nextX):
'''
判断接下来的皇后位置是否与前边发生冲突
state 存储前边所有的皇后位置,即X轴
nextX 即接下来皇后的x轴坐标
'''
nextY = len(state) #接下来皇后的Y轴坐标
for i in range(nextY):
'''
依次与前边皇后位置进行判断
'''
if abs(state[i]-nextX) in (0,nextY-i): # 0代表当前皇后与接下来这个皇后在同一列 nextY-i代表在一对角线
return True
return False
def queens(num,state=() ):
'''
结合前边的皇后位置,判断下一个皇后位置(x轴坐标)
'''
for pos in range(num): #每次确定一个x轴位置 依次与前边的皇后位置判断 是否发生了冲突
if not conflict(state,pos):
if len(state) == num-1: #如果是最后一个皇后位置
yield (pos,) # yield跟return 用法相同 但return完直接结束 跳出函数 而yield不会退出 接着执行
else:
'''
递归过程
'''
for result in queens(num,state + (pos,)): #元祖相加 (1,)+(2,) = (1,2)
yield (pos,) + result
print(list(queens(8)))