python n皇后問題

題目

n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。

上圖爲 8 皇后問題的一種解法。

給定一個整數 n,返回所有不同的 n 皇后問題的解決方案。

每一種解法包含一個明確的 n 皇后問題的棋子放置方案,該方案中 ‘Q’ 和 ‘.’ 分別代表了皇后和空位。

示例:

輸入: 4
輸出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],

["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解釋: 4 皇后問題存在兩個不同的解法。

思路

一行一行去做dfs index代表行號,從0開始
因爲不肯能在同一行放兩個皇后。
加三個標記數組:

如果這一行有皇后,就標記爲爲True,col[i]代表第i列有皇后
col = defaultdict(bool)
第一類對角線上有皇后,標記爲True
dia1 = defaultdict(bool)
# 第一類對角線行和列號相加總是爲常數
在這裏插入圖片描述
第二類對角線上有皇后,標記爲True
dia2 = defaultdict(bool)
# 第二類對角線行和列號相減總是爲常數
在這裏插入圖片描述

python代碼

from collections import defaultdict
import copy

class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        if n <= 0:
            return []
        col = defaultdict(bool)
        dia1 = defaultdict(bool)
        dia2 = defaultdict(bool)
        res = []
        row = []
        ans = []
        def dfs(index):
            if index == n:
                res.append(copy.copy(row))
                return
            for i in range(n):
                if not col[i] and not dia1[index + i] and not dia2[index-i]:
                    col[i] = True
                    dia1[index+i] = True  # 第一類對角線行和列號相加總是爲常數
                    dia2[index-i] = True # 第二類對角線行和列號相減總是爲常數
                    row.append(i)
                    dfs(index+1)
                    col[i] = False
                    dia1[index+i] = False
                    dia2[index-i] = False
                    row.remove(i)

        dfs(0)
        print(res)
        for k in range(len(res)):
            graph = []
            for i in range(n):
                temp = ""
                for j in range(n):
                    if j == res[k][i]:
                        temp += "Q"
                    else:
                        temp += "."
                    if j == n-1:
                        graph.append(temp)
            ans.append(graph)
        return ans
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章