LeetCode | 0051. N-Queens N 皇后【Python】

Problem

LeetCode

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

image

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

Example:

Input: 4
Output: [
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.

問題

力扣

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

image

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

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

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

示例:

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

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

提示:

  • 皇后彼此不能相互攻擊寂祥,也就是說:任何兩個皇后都不能處于同一條橫行、縱行或斜線上七兜。

思路

回溯

回溯模板:
res = []
def backtrack(路徑, 選擇列表):
    if 滿足結(jié)束條件:
        result.add(路徑)
        return
    
    for 選擇 in 選擇列表:
        做選擇
        backtrack(路徑, 選擇列表)
        撤銷選擇
Python3 代碼
from typing import List

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        res = []
        # 一維列表
        board = ['.' * n for _ in range(n)]

        def isValid(board, row, col):
            """
            檢查是否有皇后互相沖突
            """
            # 檢查第 row 行 第 col 列是否可以放皇后
            # 只需考慮 <= row丸凭,因為后面的棋盤是空的
            for row_index in range(row):
                # 判斷當(dāng)前行是否放了皇后
                if row_index == row:
                    if 'Q' in board[row_index]:
                        return False
                # 判斷遍歷每行時,第 col 列是否已經(jīng)放了皇后
                if 'Q' == board[row_index][col]:
                    return False
            
            # 判斷左上方是否放了皇后
            tmp_row, tmp_col = row, col
            while tmp_row > 0 and tmp_col > 0:
                tmp_row -= 1
                tmp_col -= 1
                if 'Q' in board[tmp_row][tmp_col]:
                    return False

            # 判斷右上方是否放了皇后
            tmp_row, tmp_col = row, col
            while tmp_row > 0 and tmp_col < n - 1:
                tmp_row -= 1
                tmp_col += 1
                if 'Q' in board[tmp_row][tmp_col]:
                    return False
            
            return True
        
        def replace_char(string, char, index):
            """
            構(gòu)建新的字符串進(jìn)行賦值
            """
            string = list(string)
            string[index] = char
            return ''.join(string)

        def backtrack(board, row):
            # 1.結(jié)束條件
            if row == len(board):
                # 需要用 list 轉(zhuǎn)化一下
                res.append(list(board[:]))
                return
            
            # 2.剪枝
            # m = len(board[row])
            for col in range(n):
                # 剪枝
                if not isValid(board, row, col):
                    continue
                # 3.回溯并更新 row
                board[row] = replace_char(board[row], 'Q', col)
                backtrack(board, row + 1)
                board[row] = replace_char(board[row], '.', col)
        
        backtrack(board, 0)
        return res

if __name__ == "__main__":
    n = 4
    print(Solution().solveNQueens(n))

GitHub 鏈接

Python

參考

N皇后---python解題思路

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腕铸,一起剝皮案震驚了整個濱河市惜犀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狠裹,老刑警劉巖虽界,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涛菠,居然都是意外死亡莉御,警方通過查閱死者的電腦和手機撇吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颈将,“玉大人梢夯,你說我怎么就攤上這事∏缁” “怎么了颂砸?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長死姚。 經(jīng)常有香客問我人乓,道長,這世上最難降的妖魔是什么都毒? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任色罚,我火速辦了婚禮,結(jié)果婚禮上账劲,老公的妹妹穿的比我還像新娘戳护。我一直安慰自己,他們只是感情好瀑焦,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布腌且。 她就那樣靜靜地躺著,像睡著了一般榛瓮。 火紅的嫁衣襯著肌膚如雪铺董。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天禀晓,我揣著相機與錄音精续,去河邊找鬼。 笑死粹懒,一個胖子當(dāng)著我的面吹牛重付,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崎淳,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼堪夭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拣凹?” 一聲冷哼從身側(cè)響起森爽,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚣镜,沒想到半個月后爬迟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡菊匿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年付呕,在試婚紗的時候發(fā)現(xiàn)自己被綠了计福。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡徽职,死狀恐怖象颖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姆钉,我是刑警寧澤说订,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站潮瓶,受9級特大地震影響陶冷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毯辅,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一埂伦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧思恐,春花似錦沾谜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗜逻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缭召,已是汗流浹背栈顷。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嵌巷,地道東北人萄凤。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像搪哪,于是被迫代替她去往敵國和親靡努。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容