python_N後過程詳解

倒序法

solutions中的每一個元素都是一種解法
例如 (0, 4, 7, 5, 2, 6, 1, 3), 下標代表每一行,每一個元素代表當前皇后處於第幾列
N皇后成立的標誌是啥
宮格多大?依據是啥

# -*- coding:utf-8 -*-

# 衝突檢查,在定義state時,採用state來標誌每個皇后的位置,
def conflict(state, nextY):
    nextX = len(state)
    #    print(nextX),
    for i in range(nextX):
        # 如果下一個皇后的位置與當前的皇后位置相鄰(包括上下,左右)或在同一對角線上,則說明有衝突,需要重新擺放
        if abs(state[i] - nextY) in (0, nextX - i):
            # 縱座標減去下一個皇后的縱座標的絕對值 處於 0到下一皇后橫座標減i則衝突
            return True # 衝突
    return False  # 不衝突


def queens(num, state=()):
    # num = 8
    #    print("%d "%len(state)),
    for pos in range(num):
        if not conflict(state, pos):  # 如果沒有衝突
            # 產生當前皇后的位置信息
            if len(state) == num - 1:  # 一般來說,應該是產生8個皇后,將其打印出來纔是,可這是隻有7個???
                yield (pos,)  # 生成元組
            # 否則,把當前皇后的位置信息,添加到狀態列表裏,並傳遞給下一皇后。
            else:
                for result in queens(num, state + (pos,)):  # 將符合條件的皇后位置加入state中
                    yield (pos,) + result


def prettyprint(solution):
    def line(pos, length=len(solution)):
        return '. ' * (pos) + 'X ' + '. ' * (length - pos - 1)

    for pos in solution:
        print(line(pos))


if __name__ == "__main__":
    solutions = list(queens(4))
    for i in solutions:  # 打印所有的解法
        print(i)
        prettyprint(i)
        print('*' * 100)
    # prettyprint(random.choice(list(queens(8))))  # 可能有多種解法,展示其中一種解法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章