python n皇后问题

23 篇文章 1 订阅
12 篇文章 19 订阅

题目

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值