leetcode 51 n皇后

leetcode 51 n皇后

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

題目分析:

  1. 首先看到題目需要我們找到皇后所有的可能擺放位置,那麼肯定需要我們遍歷所有可能的空間,同時在嘗試的擺放方案不合理時直接退回上一步。
  2. 直覺的方法就是遞歸,同時傳遞一個list來記錄之前嘗試的皇后的位置,每一次迭代時首先根據傳遞進來的list計算不會被之前的皇后攻擊的位置,然後在list append本輪的皇后位置後在遞歸,返回時記得把本輪append上去的皇后的位置pop掉。

Python代碼

class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        if not n:
            return [[]]
        if n == 1:
            return [['Q']]
        if n < 4:
            return []
        res = []

        def recur_find(q_list):
            if len(q_list) == n:
                temp = []
                for i in q_list:
                    temp_res = ['.' for j in xrange(n)]
                    temp_res[i] = 'Q'
                    temp.append(''.join(temp_res))
                res.append(temp)
                return
            danger_list = set()
            for level, pos in enumerate(q_list):
                pos_l = pos - (len(q_list)) + level if pos - (len(q_list)) + level >= 0 else None
                pos_r = pos + (len(q_list)) - level if pos + (len(q_list)) - level <= n - 1 else None
                if pos_l is not None:
                    danger_list.add(pos_l)
                if pos_r is not None:
                    danger_list.add(pos_r)
                danger_list.add(pos)
            for i in xrange(n):
                if i in danger_list:
                    continue
                q_list.append(i)
                recur_find(q_list)
                q_list.pop()

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