美文网首页
N-皇后问题

N-皇后问题

作者: LuDon | 来源:发表于2019-01-31 10:38 被阅读3次

问题描述:有N个皇后,需要放在N*N的棋盘上,同一行、同一列、同一对角线不能同时出现两个及以上的皇后,一共有多少种方法?

思路:

  • 使用长度为N的向量a保存第I行的皇后所在的列的位置。
  • 判断第i行第j列是否可以放置皇后的条件:
    1、所在行所在列没有皇后,a的其他元素值没有为j的;
    2、所在对角线没有皇后,abs(a[i]-col) == abs(row-i)
  • 逐行遍历
import numpy as np
def to_list(a):
    l = []
    for i in range(len(a)):
        p = list('.' * len(a))
        p[int(a[i])] = 'Q'
        l.append(''.join(p))
    return l
def is_valid(row, col, a, num_queen):
    for i in range(num_queen):
        if a[i] == col or (abs(a[i]-col) == abs(row-i)):
            return 0
    return 1
    
class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        num_queen = n
        a = np.ones(num_queen)*(-888)
        
        i = j = 0
        num_result = 0
        result = []
        while i < num_queen:
            while j < num_queen:
                #如果i行j列可以放皇后, 第i行找到位置放皇后
                if is_valid(i, j, a, n):
                    a[i] = j
                    j = 0 
                    break
                else:
                    j += 1
            #如果i行没有找到位置放皇后
            if a[i] < 0:
                if i==0:
                    break
                else:
                    i -= 1
                    j = a[i] + 1
                    a[i] = -888
                    continue
            #如果i行找到位置,如果是最后一行,说明找到了一个结果
            if i == num_queen-1:
                b = a.copy()
                result.append(to_list(b))
                num_result += 1
                j = a[i] + 1
                a[i] = -888
                continue
            #如果找到位置,且不是最后一行,寻找下一行
            i += 1
        return result

相关文章

  • 【算法】用回溯法(backtracking algorithm)

    什么是N-皇后问题? 说到这个N-皇后问题,就不得不先提一下这个历史上著名的8皇后问题啦。 八皇后问题,是一个古老...

  • N皇后问题(附带JavaScript源代码)

    什么是N-皇后问题? 说到这个N-皇后问题,就不得不先提一下这个历史上著名的8皇后问题啦。 八皇后问题,是一个古老...

  • N-皇后问题

    国际象棋中皇后可攻击其所在行、列以及对角线上的棋子。N-皇后问题是要在N行N列的棋盘上放置N个皇后,使得皇后必吃之...

  • N-皇后问题

    问题描述:有N个皇后,需要放在N*N的棋盘上,同一行、同一列、同一对角线不能同时出现两个及以上的皇后,一共有多少种...

  • 后海老师的朗读练习

    ian-uan对比(一) 烟yān-渊yuān 钱qián-权quán 尖jiān-娟juān 欠qiàn-劝qu...

  • 无穷级数

    数项级数判敛问题 重点记住:数项级数Un收敛可以推导出Un在n->∞时=0Un在n->∞时=0不可以推导出Un收敛...

  • 2019波谱解析复习纲要

    熟悉以前名词含义 吸收光谱 电子跃迁 σ-σ*跃迁 π-π*跃迁 n-π*跃迁 n-σ*跃迁 增色效应 减色...

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 皇后问题

    经常做算法赛题的朋友们都知道,八皇后问题是一道经典的搜索回溯题。简单来说,皇后问题就是在一个国际象棋棋盘上摆放若干...

  • 回溯之N皇后

    N皇后问题:在 n x n 的棋盘上放置 N 个皇后,使其不能相互攻击。 1. 问题分析 皇后相互攻击是指:在皇后...

网友评论

      本文标题:N-皇后问题

      本文链接:https://www.haomeiwen.com/subject/kimcsqtx.html