Leetcode 51. N-Queens 和 52. N-Queens II

51. N-Queens

题目描述:输入n, 在n行n列的数组中,每一行放置一个Queue,所有queue不能再同一列,不能在同一个斜对角

解释:(1)需要判断放置到该位置的queue是否合法,即不能在同一列,斜对角,这里用一个数组a记录每一行放置queue的位置,a[i]表示i行放置queue的位置,则当前放置的queue不能与数组a里面的值相同,处理斜对角,在斜对角的位置行列互减的绝对值相等, 即abs(a[i] - a[k]) == abs(i - k),满足这两个条件任何一个return False

           (2)处理回溯,跳出条件即为当  当前行数k == n时

    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        a = [None for _ in range(n)]
        result = []
        self.backstacking(a, n, 0, result)
        return result

    def backstacking(self, a, n, k, result):
        if k == n:
            result.append(self.printQueue(a, n))
            return
        for i in range(n):
            a[k] = i
            if self.isValid(a, k):
                self.backstacking(a, n, k+1, result)
            else:
                continue

    # 用一个一维数组来存储皇后,a[i] 表示i行皇后的位置,判断a[i]是否与当前j列冲突即可
    # 斜线冲突,通过观察可以发现所有在斜线上冲突的皇后的位置都有规律即它们所在的行列互减的绝对值相等abs(a[i] - c) == abs(i-r)
    def isValid(self, a, k):
        for i in range(k):
            if a[i] == a[k] or abs(a[i] - a[k]) == abs(i - k):
                return False
        return True

    def printQueue(self, a, n):
        result = []
        for x in range(n):
            for row in range(x, x+1):
                tmp = ""
                for col in range(n):
                    if x == row and col == a[x]:
                        tmp += 'Q'
                    else:
                        tmp += '.'
                result.append(tmp)
        return result

52. N-Queens II    

题目描述:类似上一题计算有几种放置的方法

解释:在满足条件,即k == n时, result += 1即可

    def totalNQueens(self, n):
        """
        :type n: int
        :rtype: int
        """
        a = [None for _ in range(n)]
        self.result = 0
        self.backstacking(a, n, 0, self.result)
        return self.result

    def backstacking(self, a, n, k, result):
        if k == n:
            self.result += 1
            return
        for i in range(n):
            a[k] = i
            if self.isValid(a, k):
                self.backstacking(a, n, k+1, self.result)
            else:
                continue

    # 用一个一维数组来存储皇后,a[i] 表示i行皇后的位置,判断a[i]是否与当前j列冲突即可
    # 斜线冲突,通过观察可以发现所有在斜线上冲突的皇后的位置都有规律即它们所在的行列互减的绝对值相等abs(a[i] - c) == abs(i-r)
    def isValid(self, a, k):
        for i in range(k):
            if a[i] == a[k] or abs(a[i] - a[k]) == abs(i - k):
                return False
        return True

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值