Python 八皇后解法(非遞迴版本)

自己開路自己走發表於2019-04-14
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)

 

 

相關文章