N皇后问题分析与求解+算法图解和流程图

  • 一、问题描述
  • 二、问题分析
  • 三、算法流程图
  • 四、源码
  • 五、复杂度

一、问题描述

问题描述:n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
以下是4皇后问题的结果模型:

输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:4皇后问题存在两个不同解法

输入:n = 1
输出:[[“Q”]]
解释:1皇后问题只存在一种解法

二、问题分析

该问题要求把n个皇后放在一个n×n的棋盘上,使任何两个皇后不能同行不能同列也不能位于同一对角线上。用回溯的思想对它求解:因为每个皇后都必须占据一行,所以我们的问题转化为给每行的皇后分配一个合适的列。
n=1,2,3时问题很简单,所以我们以n=4开始考虑,求解过程如下:
如下图是一个空的4皇后问题的棋盘模型,

我们从空棋盘开始,首先将皇后1放到它所在行的第一个可能位置(此时为第一列),即皇后1的坐标为(1,1);对于皇后2,尝试将其填入第一列检查是否符合规则,发现失败,第二列也失败,第三列符合要求,即将皇后2填入(2,3);再将皇后3依规则找第一个可能的位置,但是发现四个位置都不符合,所以将算法回溯,把皇后2放在下一个可能位置,即(2,4)上,这样皇后3可以放在(3,2),去找皇后4能不能放,此时又发现没有符合的位置,然后回溯到皇后3,皇后3没有再可以尝试的位置,回溯到皇后2也没有再可以尝试的位置,回溯到皇后1,把皇后1放在(1,2),接着按相同步骤将皇后2放在(2,4),皇后3放在(3,1),皇后4放在(4,3),这就是n=4时的一个解,接着再次回溯找剩下的解。

三、算法流程图

四、源码

class Solution {List<List<String>> res = new ArrayList<>();public List<List<String>> solveNQueens(int n) {char[][] chessboard = new char[n][n];for (char[] c : chessboard) {Arrays.fill(c, '.');}backTrack(n, 0, chessboard);return res;}public void backTrack(int n, int row, char[][] chessboard) {if (row == n) {res.add(Array2List(chessboard));return;}for (int col = 0;col < n; ++col) {if (isValid (row, col, n, chessboard)) {chessboard[row][col] = 'Q';backTrack(n, row+1, chessboard);chessboard[row][col] = '.';}}}public List Array2List(char[][] chessboard) {List<String> list = new ArrayList<>();for (char[] c : chessboard) {list.add(String.copyValueOf(c));}return list;}public boolean isValid(int row, int col, int n, char[][] chessboard) {// 检查列for (int i=0; i<row; ++i) { // 相当于剪枝if (chessboard[i][col] == 'Q') {return false;}}// 检查45度对角线for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {if (chessboard[i][j] == 'Q') {return false;}}// 检查135度对角线for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {if (chessboard[i][j] == 'Q') {return false;}}return true;}
}

五、复杂度

时间复杂度为:O(N!)
分析:使用一个数组记录每行放置的皇后的列下标,依次在每一行放置一个皇后。每次新放置的皇后都不能和已经放置的皇后之间有攻击:即新放置的皇后不能和任何一个已经放置的皇后在同一列以及同一条斜线上,并更新数组中的当前行的皇后列下标。当 N个皇后都放置完毕,则找到一个可能的解。当找到一个可能的解之后,将数组转换成表示棋盘状态的列表,并将该棋盘状态的列表加入返回列表。
由于每个皇后必须位于不同列,因此已经放置的皇后所在的列不能放置别的皇后。第一个皇后有 N 列可以选择,第二个皇后最多有 N−1 列可以选择,第三个皇后最多有 N-2 列可以选择(如果考虑到不能在同一条斜线上,可能的选择数量更少),因此所有可能的情况不会超过 N!种,遍历这些情况的时间复杂度是 O(N!)。

N皇后问题分析与求解算法图解、流程图和复杂度相关推荐

  1. n皇后问题-回溯法求解

    n皇后问题-回溯法求解 1.算法描述 在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. n皇后是由八皇后问题演变而来的.该问题 ...

  2. 机器学习入门及基本算法图解

    基本算法 最近在学习神经网络,整理了一些算法,写出来给自己一点交代吧,本人刚入算法没多久,如果有不对的地方,请指出来大家一起学习,谢谢. 费曼算法(Feynman algorithm) 将这个算法放在 ...

  3. 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  4. 算法图解:如何判断括号是否有效?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 今天要讲的这道题是 bilibili 今年的笔试真题,也是一道关于栈的经典面试题. ...

  5. 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  6. 《算法图解》读书笔记

    这是一本很入门的算法书,介绍的东西还算简单明了,大体补充了一些自己没理解的东西. 粗略地看了一下,感觉还是"纸上得来终觉浅,绝知此事要躬行!" <<算法图解>&g ...

  7. 《算法图解》读书笔记—像小说一样有趣的算法入门书

    前言 学习算法课程的时候,老师推荐了两本算法和数据结构入门书,一本是<算法图解>.一本是<大话数据结构>,<算法图解>这本书最近读完了,读完的最大感受就是对算法不再 ...

  8. Python实现VRP常见求解算法——蚁群算法(ACO)

    基于python语言,实现经典蚁群算法(ACO)对车辆路径规划问题(CVRP)进行求解. 目录 优质资源 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 ...

  9. 【进阶四】Python实现(MD)HVRP常见求解算法——蚁群算法(ACO)

    蚁群算法+Split 求解异构车辆路径规划问题 目录 信息传递 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 信息传递 python实现6种智能 ...

最新文章

  1. linux cat pdf文件怎么打开,linux下cat 命令使用详解:显示文件内容
  2. SPOJ problem 42: Adding Reversed Numbers
  3. 总的秒数等于几小时几分钟几秒(Python)
  4. Java JNI浅析(一)
  5. cisco 2960-24 配置(生产环境)
  6. 云+X案例展 | 金融类:七牛云Pandora 助阵某银行实现日志智能管理
  7. matlab sar 斑马图,星载合成孔径雷达(SAR)斑马图仿真与研究
  8. 已经是最大股东却还要全资收购!腾讯看上了搜狗的啥?
  9. Sphinx以及coreseek的安装及使用
  10. 人与人之间交往最重要的是什么?
  11. 孙鑫VC学习笔记:第十六讲 (三) 用异步套接字编写聊天程序
  12. 华为交换机模拟器为什么不能配置IP(或反)?如何在华为设备上配置远程管理设备?如何保存ENSP的配置...
  13. 贝叶斯网络:故障诊断方法研究
  14. matlab画增益频率,HFSS中如何查看增益随频率的变化曲线?
  15. 单链表的创建(头插法尾插法),插入,删除
  16. 机器学习在重度抑郁症患者中的应用:从分类到治疗结果预测
  17. 怎么把做好的ps保存成图片_PS保存图片提示“无法完成请求”,这里有4种解决方法...
  18. 【文献阅读】医学图像分割中的loss函数选择-Loss odyssey in medical image segmentation loss
  19. Python实现将多张图片拼接为一张
  20. Going out on a limb:Joint Extraction of Entity Mentions and Relations without Dependency Trees【论文笔记】

热门文章

  1. 关于dm365的resizer
  2. 短信验证码与图形验证码搭配使用更安全
  3. 创业初期,单身vs已婚
  4. 智能小车远程控制系统
  5. 女人怎么去爱自己的男人!!(给女士们看看)声明我是男的 ^_^
  6. 凸集、凸函数及其充分必要条件
  7. COCO数据集josn转txt格式
  8. wxWidgets界面设计工具DialogBlocks
  9. android 点9图片,安卓UI设计基础教程: 什么是点九图,怎么切点九图
  10. zynq7000系列PS端GPIO初始化函数XGpioPs_LookupConfig()和XGpioPs_CfgInitialize()详解