• n皇后问题(回溯算法)


    问题定义:国际象棋中,皇后可以直线进攻也可以斜线进攻,问在NxN的国际象棋棋盘上摆N个皇后,问摆使得N个皇后之间无法相互进攻有多少种摆法?

    通过回溯法解决。

    def isValid(matrix,row,col):
        n = len(matrix)
        for i in range(row):
            for j in range(n):
                if matrix[i][j]=='Q' and (j==col or abs(row-i)==abs(col-j)):
                    return False
        return True
    class Solution:
        def solveNQueens(self, n: int):
            matrix = [['.' for _ in range(n)] for __ in range(n)]
            matrixs = []
            def dfs(x):
                if x==n:
                    tmp = matrix.copy()
                    for i in range(n):
                        tmp[i] = ''.join(tmp[i])
                    matrixs.append(tmp)
                    return
                for col in range(n):
                    if isValid(matrix,x,col):
                        matrix[x][col]='Q'
                        dfs(x+1)
                        matrix[x][col]='.'
            dfs(0)
            return matrixs

     关键在于判断当前皇后的位置和已经安排的皇后的位置是否冲突,深度优先搜索 dfs(x)中x代表皇后所在的行,由于我们是一行一行依次摆放皇后的,所以不存在行冲突。只需要判断列冲突和斜线的冲突。

    判断条件  matrix[i][j]==1 and ( j==col and abs(row-i)==abs(col-j))   

    解释一下斜线的判断:  前面放置的皇后的位置 i,j   与  此刻皇后的位置 row ,col   行的间距和列的间距正好相等,说明他们在一条斜线上。

  • 相关阅读:
    Could not find the Qt platform plugin windows错误解决方法
    解决MySQL 8.0数据库出现乱码的问题
    C# Winform程序设计运行在高分屏下模糊解决办法
    如何配置SQL Server数据库远程连接
    PyCharm安装及使用教程
    Chrome谷歌浏览器实用插件
    Visual Studio 2017中如何创建安装打包项目
    Python如何打包EXE可执行文件
    C#中控制线程池的执行顺序
    .net core 部署在Centos 7/8 的几个小坑
  • 原文地址:https://www.cnblogs.com/bianque/p/13544408.html
Copyright © 2020-2023  润新知