问题描述

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。


算法分析

回溯法又称试探法。回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。
基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

不考虑规则的话,每一个皇后放在棋盘上都有8种放法,这样我们能得到一棵完全八叉树:从根节点开始,树每增加一层就是多放一个皇后。接下来是对这棵树进行深度优先遍历,并且舍弃不合规则的子节点。

用 x[i] 表示在第 i 行,皇后放在 x[i] 的位置上(想象关于 i 的函数 f(i) ),要求行和列不相同,即 x[i] != x[j] ,要求对角线也不相同,即 abs(i-j) != abs(x[i]-x[j]) ,代码如下:

import static java.lang.StrictMath.abs;public class N_Queen {private int num;private boolean[][] matrix;private static int count = 1;private N_Queen(int num) {this.num = num;this.matrix = new boolean[num + 1][num + 1];place(1);}//  判断matrix[i][j]与前面的i-1个皇后是否冲突private boolean isLegal(int i, int j) {for (int m = 1; m <= i - 1; m++) {for (int n = 1; n <= num; n++) {if (matrix[m][n]) {if (n == j || abs(i - m) == abs(j - n)) { //与某一个皇后同列或者对角时退出return false;}}}}return true;}//  打印private void print() {System.out.println("case" + count++);for (int i = 1; i <= num; i++) {for (int j = 1; j <= num; j++) {if (matrix[i][j]) {System.out.print("Q  ");} else {System.out.print("·  ");}}System.out.println();}System.out.println();}//  放置第i个皇后private void place(int i) {//  进入本函数时,前i-1个皇后已放置完毕if (i > num) {print();} else {for (int j = 1; j <= num; j++) {matrix[i][j] = true;if (isLegal(i, j)) {place(i + 1);}matrix[i][j] = false;}}}public static void main(String[] args) {new N_Queen(8);}
}

看了一些大神的代码,先mark一下以后研究 目前最快的n皇后问题算法

算法/回溯法/8-Queen八皇后问题相关推荐

  1. 回溯法在解决八皇后问题中的应用

    回溯法:有这样一类题目,它们要求在相对问题的输入规模按照指数速度增长(或者更快)的域中,找出一个具有指定特性的元素.例如:在图顶点的所有排列中求一个哈密顿回路,在背包问题的一个实例中求其中最有价值的物 ...

  2. 有趣的数据结构算法12——利用递归解决八皇后问题

    有趣的数据结构算法12--利用递归解决八皇后问题 题目复述 解题思路 实现代码 GITHUB下载连接 本次教程主要讲述如何利用递归解决八皇后问题,它和汉诺塔一样让人很难过. 题目复述 据说西洋棋手都具 ...

  3. 基本算法-回溯法(迷宫问题)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 本文介绍一种经典算法--回溯法,可作为迷宫问题的一种解法,以下是本篇文章正文内容,包括算法 ...

  4. 算法学习笔记之三:八皇后问题(递归、回溯)

    (一)题记 从去年下半年开始找工作,大大小小也被"鄙"试."面"试了n多回了.说实话只怪自己并未对常见的笔试题.面试题进行准备,导致败下阵来.一门学问要想学透学 ...

  5. Las Vegas 与回溯组合法解八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  6. 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II

    回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...

  7. 递归--基于回溯和递归的八皇后问题解法

    八皇后问题是在8*8的棋盘上放置8枚皇后,使得棋盘中每个纵向.横向.左上至右下斜向.右上至左下斜向均只有一枚皇后.八皇后的一个可行解如图所示:                             ...

  8. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  9. 算法 --- 回溯法

    回溯法 参考 - 剑指Offer 回溯法可以看成蛮力法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案. 回溯法解决的问题的特性: 可以形象地用树状结构表示: 节点: 算法中 ...

  10. 算法---回溯法--模板解法

    回溯法问题:实际上就是一个决策树的遍历过程 分为三步: 路径:已做出选择的路径. 选择列表:当前可以做的选择 结束条件:就是到达决策树的底层,无法再做出选择的条件.(退出条件 ) template&l ...

最新文章

  1. 影像组学视频学习笔记(18)-使用MRIcroGL软件格式转换、勾画ROI、Li‘s have a solution and plan.
  2. 因为那里面有我,也有你
  3. 使用mod_proxy_balancer实现负载均衡
  4. 【iOS开发】跳转到『设置App』的任意条目
  5. CATIA中使用约束时提示“创建的约束是临时的。若希望使他成为永久约束,则需要在单击确定按钮之前激活约束开关。”
  6. GCC在C语言中内嵌汇编 asm __volatile__
  7. 是无数像老钟叔的p8u8
  8. python界面-(八)Python 图形化界面设计
  9. linux yum安装驱动,centos8安装alsa驱动
  10. 性别歧义代词(GAP) 2019年 NLP 研讨会性别偏见问题共同任务--阅读笔记
  11. 5G网优工程师需要会使用哪些软件?Mapinfo是必要!
  12. jQuery Ajax 实例 全解析(转载)
  13. VC无负担实现XP风格界面
  14. ring buffer 环形队列 C++实现
  15. 知道挖掘搜索引擎关键字的步骤吗?
  16. 一行代码可以做什么?
  17. Tableau考试指南部分试题(用步骤,过程,考试内容说明)
  18. php exception trace,php Exception打印error trace 实例
  19. pdf转cad用什么软件比较不错
  20. 打破时空界限 你我与未来在HCFT智能硬件供应链大会遇见

热门文章

  1. Java实战项目-移动电商秒杀系统seckill优化
  2. bayaim_今晚打老虎
  3. Java并发编程面试题合集
  4. 使用 Anaconda 安装 Pytorch
  5. k2450 linux 显卡驱动,Debian系统安装NVIDIA驱动支持双显卡切换
  6. “智慧银行”行业研究报告要点整理
  7. python中的headers是什么意思_Python设置Headers
  8. css中的相对定位、绝对定位、固定定位
  9. 非线性方程-概念应用及解法
  10. signature=71820b070a82d48c44cc938baccfcfc9,基于集成神经网络的离线手写签名鉴别方法