import Stack # 假设已经定义好栈类
def conflict(state, nextX):
'''判断新皇后的落点是否与前一皇后冲突
1、如果新皇后与前一皇后在同一列,则 state[i] == nextX
2、如果新皇后与前一皇后在同一行,则 i == nextY
3、如果新皇后在前一皇后右对角线 ,则 nextX - state[i] == nextY - i
4、如果新皇后在前一皇后左对角线,则 state[i] - nextX == nextY - i
'''
nextY = len(state)
for i in range(nextY):
if abs(state[i] - nextX) in (0, nextY - i):
return True
return False
def queen(num = 8, state = ()):
st = Stack.Stack()
st.push([0,state]) # 每一个位置包含下一搜索位置及相应的位置状态信息
while not st.is_empty():
now_queen = st.pop() # 从栈中弹出一个位置
for pos in range(now_queen[0], num):
temp_state = now_queen[1]
if not conflict(temp_state, pos):
if len(temp_state) == num - 1:
temp_state = temp_state + (pos,)
print (temp_state)
else:
now_queen[0] = pos + 1
st.push(now_queen)
next_queen = [0, temp_state + (pos,)]
st.push(next_queen)