N皇后的规则:任意两个皇后不在同一行,不在同一列,不在同一斜线上。

算法分析:这种问题就用回溯法。深度搜索然后回溯。用一个数组记录每一行皇后的位置,下标代表行,值代表列。对行深度搜索。

public class NQueens
{public List<List<String>> solveNQueens(int n){List<List<String>> res = new ArrayList<>();if(n <= 0){return res;}int[] columnVal = new int[n];DFS_helper(n, res, 0, columnVal);return res;}public void DFS_helper(int queensNum, List<List<String>> res, int row, int[] columnVal){if(row == queensNum)//已经遍历所有行了,得到结果{List<String> list = new ArrayList<>();for(int i = 0; i < queensNum; i ++){StringBuffer sb = new StringBuffer();for(int j = 0; j < queensNum; j ++){if(j == columnVal[i]){sb.append("Q");}else{sb.append(".");}}list.add(sb.toString());}res.add(list);}else{for(int i = 0; i < queensNum; i ++){columnVal[row] = i;if(isValid(row, columnVal))//合法,就寻找下一行的位置,否则,变换当前行的值{DFS_helper(queensNum, res, row+1, columnVal);}}}}public boolean isValid(int row, int[] columnVal){for(int i = 0; i < row; i ++){if(columnVal[i] == columnVal[row] || Math.abs(columnVal[row] - columnVal[i])== row - i){return false;}}return true;}public static void main(String[] args){NQueens q = new NQueens();List<List<String>> list = q.solveNQueens(8);Iterator<List<String>> it = list.iterator();int count = 0;while(it.hasNext()){System.out.println(it.next());count ++;}System.out.println(count);}
}

NQueens2:计算有多少种解决方案。

算法分析:用一个成员变量来记录解决方案的个数。

public class Nqueens2 {public int count;public int totalNQueens(int n){count = 0;if(n <= 0){return count;}int[] columnVal = new int[n];DFS_helper(n, 0, columnVal);return count;}public void DFS_helper(int queensNum, int row, int[] columnVal){if(row == queensNum)//已经遍历所有行了,得到结果{count ++;}else{for(int i = 0; i < queensNum; i ++){columnVal[row] = i;if(isValid(row, columnVal))//合法,就寻找下一行的位置,否则,变换当前行的值{DFS_helper(queensNum, row+1, columnVal);}}}}public boolean isValid(int row, int[] columnVal){for(int i = 0; i < row; i ++){if(columnVal[i] == columnVal[row] || Math.abs(columnVal[row] - columnVal[i])== row - i){return false;}}return true;}
}

转载于:https://www.cnblogs.com/masterlibin/p/5760847.html

NQueens, NQueens2 N皇后问题,递归回溯相关推荐

  1. 蓝桥杯 2n皇后(java递归回溯)

    一.2n皇后问题 问题描述: 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在 ...

  2. 8皇后问题-递归-回溯(Java)

    目录 5.6 递归-八皇后问题(回溯算法) 5.6.1 解题思路 5.6.2 代码实现 第一遍的是跟着老师做的,所以添加了我自己大量的注解. 本次n皇后问题出自韩顺平的数据结构和算法 5.6 递归-八 ...

  3. 递归/回溯:八皇后问题N-Queens

    N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...

  4. 十二、八皇后问题(递归回溯)

    一.八皇后问题介绍 (本次使用回溯算法解决,之后会用贪心算法优化) 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行. 同一列或同一斜线上,问有多少种摆法(9 ...

  5. LeetCode—笔记—51、N皇后——递归回溯,个人思路,简单易懂

    LeetCode-笔记-51.N皇后--递归回溯,个人思路,简单易懂 51. N 皇后 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 ...

  6. 递归回溯解决八皇后问题

    文章目录 前言 八皇后问题 问题解析 代码实现 完整代码 前言 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇 ...

  7. 非递归求解N皇后问题(回溯法)

    一般而言,回溯法可以说是一种穷举法,适合于求解各种深度优先搜索的问题. 回溯法是一种应用广泛的算法.其关键点是解空间树和n元组可行解的定义. 非递归回溯法程序的结构基本上是相同的,该程序的结构可以用求 ...

  8. N皇后问题(递归回溯)

    今天讲了N后问题,现在来复习一下. N后问题就是在N*N格的棋盘上面放置彼此不受攻击的n个皇后.这里的皇后指的是国际象棋中的皇后,按照国际象棋的规则,皇后可以攻击当前行和当前列还有同一斜线的棋子.简单 ...

  9. 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...

最新文章

  1. 将TVM集成到PyTorch
  2. 十大排序算法 导图总结
  3. 怎样使用fastJson发送数组格式的Json数据
  4. MATLAB中squeeze函数的作用
  5. angular之表单
  6. Hadoop hdfs创建及删除目录代码示例
  7. 一文看懂WebTransport
  8. c++注释快捷键_是不是晚了点:Visual Studio可以自动生成注释啦!
  9. 本周没有学习,估计用脑过度...
  10. 个人作业六:单元测试
  11. wps完成率怎么设置_WPS表格里怎么设置完成率公式?
  12. elementui表格序号自增
  13. 3D全景图php代码,HTML5 Canvas实现360度全景图的示例代码
  14. 《勇者名录》11.19正式上线链游玩家|休闲养肝、探索大陆
  15. Linux如何卸载软件
  16. C++ OpenCV 基于HSV颜色分割区域、获取目标
  17. mysql函数名称顿号_在中文Windows 7的输入中文标点符号状态下,按下列( )可以输入中文标点符号顿号...
  18. C练题笔记之:Leetcode-第 85 场双周赛---6156. 得到 K 个黑块的最少涂色次数
  19. 【Howe学爬虫】全国统计用区划代码爬取
  20. 米家机扫拖机器人说明书_【米家扫拖机器人1C怎么样使用体验】动态导航|缓冲模块|电控水箱|红外发射|APP_摘要频道_什么值得买...

热门文章

  1. 如何通过Windows Server 2008 R2建立NFS存储
  2. 主成份分析(PCA)详解
  3. Go 函数特性和网络爬虫示例
  4. 革新以太网交换机架构 全光网络的风刮进园区
  5. Python+Flask.0010.FLASK即插视图之自定义视图类及修饰器
  6. 浅谈https(创建、传输、断开)
  7. System Center 2012R2之SCVMM云部署SCOM(2-2)
  8. MS SQL 能否修改实例名称
  9. 软件需求规格说明书通用模版_通用需求挑战和机遇
  10. 匿名内部类和匿名类_匿名schanonymous