python--lintcode33 · N皇后问题(一)

描述

N皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线)。给定一个整数n,返回所有不同的N皇后问题的解决方案。每个解决方案包含一个明确的N皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

样例

样例 1:

输入:

n = 1

输出:

[["Q"]]

解释:

只有一种方案。

样例 2:

输入:

n = 4

输出:

[
  // Solution 1
  [".Q..",
   "...Q",
   "Q...",
   "..Q."
  ],
  // Solution 2
  ["..Q.",
   "Q...",
   "...Q",
   ".Q.."
  ]
]

解释:

有两种解决方案。

这一题还是比较有难度,首先要确定的是求所有解决方案,肯定是使用DFS来做。然后就要思考什么时候Q能够放置。Q不能放同一列,所有每列只能有一个Q。不能放对角线,这里要用数学的思维算一下,对角线上位置的坐标,要么和相等,要么差相等。可以自己在草稿纸上画一下。

代码如下:

class Solution:
    """
    @param: n: The number of queens
    @return: All distinct solutions
    """
    def solveNQueens(self, n):
        # write your code here
        # 同一列不能有两个Q,对角线不能有两个Q。对角线上坐标的和or差一样
        visited={
            'col':set(),
            'sum':set(),
            'dif':set()
        }
        self.results=[]
        if n==0:
            return []
        self.dfs(n,[],visited)
        return self.results

    def dfs(self,n,permutation,visited):
        if n==len(permutation):
            self.results.append(self.draw(n,permutation))
        # 当前是第几行
        row=len(permutation)
        # 搜索每一列
        for col in range(n):
            if not self.isvalid(row ,col,visited):
                continue

            permutation.append(col)
            visited['col'].add(col)
            visited['sum'].add(row+col)
            visited['dif'].add(row-col)
            self.dfs(n,permutation,visited)
            visited['col'].remove(col)
            visited['sum'].remove(row + col)
            visited['dif'].remove(row - col)
            permutation.pop()

    def isvalid(self,row,col,visited):
        if col in visited['col']:
            return False
        if col+row in visited['sum']:
            return False
        if row-col in visited['dif']:
            return False
        return True

    def draw(self,n,permutation):
        results=[]
        for i in range(n):
            s=''
            for j in range(n):
                if permutation[i]==j:
                    s=s+'Q'
                else:
                    s=s+'.'
            results.append(s)
        return results


nums =4
s = Solution()
print(s.solveNQueens(nums))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呦不错的温jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值