八皇后问题

回溯算法的经典案例

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

思路分析

  1. 第一个皇后先放在第一行第一列
  2. 第二个皇后放在第二行第一列、然后判断是否0K,如果不OK, 继续放在第二列、第三列、依次把所有列都放完,找到一个合适
  3. 继续第三个皇后,还晕第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解
  4. 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到
  5. 然后回头继续第-一个皇后放第二列,后面继续循环执行1,2,3的步骤

**说明:**理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法用一个一维数组即可解决问题. arr[8]={0,4,7,5,2,6, 1,3}表示一个正解

对应arr下标表示第几行,即第几个皇后,arr[i]=val , val表示第i+1个皇后,放在第i+1行的第val+1列

效率可能比较低,后面也有算法对其进行优化,比如贪心算法等,后面的笔记会提到

代码

package com.wang.Recursion;
/*** @author 王庆华* @version 1.0* @date 2020/12/20 19:45* @Description TODO* @pojectname 八皇后问题*/
public class Queue8 {//定义一个max表示共有多少个皇后int max = 8;//定义数组array,保存皇后放置的位置,比如arr[8]={0,4,7,5,2,6, 1,3}int[] array = new int[max];static int count = 0;public static void main(String[] args) {//测试Queue8 queue8 = new Queue8();queue8.check(0);System.out.println("一共有"+count+"次解法");}//编写一个方法,放置第n个皇后//特别注意:check是每一层递归时,进入到check都有for循环,因此会有回溯private void check(int n){//如果n = max,皇后放完了,if (n == max){print();return;}//没有放完的话,依次放入皇后,判断是否冲突for (int i = 0; i < max ; i++) {//先把当前的皇后n,放到改行的第一列array[n] = i;//判断当放置了第n个皇后到i列时,是否冲突if (judge(n)) {//不冲突,接着放n+1个皇后,即开始递归check(n+1);}//如果冲突,就继续执行array[n] = i;这个时候i已经++了,就是放到了下一列}}/**//查看当我们放置第n个皇后时,就去检测该皇后是否和前面已经摆好的皇后冲突* @param n 表示第n个皇后* @return*/private boolean judge(int n){for (int i = 0; i <n ; i++) {//array[i] == array[n]表示第n个皇后是否和前面i个皇后是否在同一列//Math.abs(n-i) == Math.abs(array[n] - array[i]表示第n个皇后是否和第i个皇后在同一斜线if (array[i] == array[n] ||Math.abs(n-i) == Math.abs(array[n] - array[i] )){return false;}}return true;}//将皇后拜访的位置打印出来private void print(){count++;for (int i = 0; i <array.length ; i++) {System.out.print(array[i]+"");}System.out.println();}
}

递归算法应用实例------八皇后算法相关推荐

  1. 八皇后算法python_Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  2. 前端开发:JS中关于八皇后算法的使用

    前言 在前端开发过程中,关于算法的使用也是非常常见的操作,尤其是处理一些复杂的业务场景,还有就是前端获取到后端返回的复杂结构的数据,所以说前端开发中处处都有算法使用的场景.开发者从接触编程开发开始,就 ...

  3. PHP实现八皇后算法-回溯算法

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以 ...

  4. Java基础记忆12(八皇后算法和五子棋玩法)

    首先,在国际象棋中.八皇后是8*8棋盘,其中皇后可以直线行走,可以斜线行走,不分上下左右格数的. 附可行摆法: 所以,可归纳问题的条件为,8皇后之间需满足: 1.不在同一行上              ...

  5. java编写八皇后算法

    /*** 八皇后* @Author:yangle* @Date:2020/9/23* @version:1.0*/ public class test {public static int num = ...

  6. python中八皇后如何运算的_python解决八皇后算法

    展开全部 global col #定义一些全局变量 global row global pos_diag global nag_diag global count def output(): ''' ...

  7. 递归算法——八皇后问题 python

    研究了一下午的八皇后算法,可算是搞明白了,为了避免以后忘记,还是写个博客吧!可能会跟其他文章有相似之处,最终还是希望能好好学习算法,都是经过自己思考后亲自写的代码,虽然过程比较艰难,我写了很多注释. ...

  8. 八皇后回溯算法原理剖析及其JS实现

    八皇后回溯算法(JS实现) 八皇后算法描述如下: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法! 下面来分析一波,假设此时我 ...

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

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

  10. 八皇后 C++ 递归算法和循环嵌套算法 共得到 92 种题解

    八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后问题 ...

最新文章

  1. Form_通过FND_FNDFLUPL标准功能上传CSV控件(案例)
  2. 本年扩增子、宏基因组课程报名已满,想要学最早等明年
  3. Swift Web 开发之 Vapor - 路由(二)
  4. ant man 什么意思_浅谈为什么很多蓝牙模块厂家选择nRF52832?
  5. python中发送带附件的邮件,python SMTP实现发送带附件电子邮件
  6. rz/sz命令参数解释
  7. java 计算器 下载_那里可以下载到JAVA编的计算器程序??
  8. Android ListView更改item背景颜色
  9. NHibernate视频教程
  10. Drool的global变量
  11. Linux指纹识别相关配置
  12. 算术平均数、几何平均数、
  13. linux账号延期,Linux用户密码过期延期
  14. 国土规划之双评价的主要数据类型与来源(甲B)
  15. FFmpeg压缩MP4视频命令
  16. 2020.08.20_Task1_基于逻辑斯特模型,实现分类预测
  17. 021-MongoDB数据库从入门到放弃
  18. 爱情保卫战经典语录全集
  19. 国内三大手机运营商号段
  20. 批量修改 Word 、Excel、PPT 文档中的标题、作者、版本号、公司、创建时间等元数据

热门文章

  1. 移动互联网组建与优化
  2. 论文阅读--SAP-SSE: Protecting Search Patterns and Access Patterns in Searchable Symmetric Encryption
  3. 又是一年腊八节 记忆中的腊八粥是什么味道?
  4. 《四》大话 TypeScript 泛型
  5. 强大的Pidgin,Pidgin的使用
  6. pidgin qq_充分利用Pidgin的5条提示和技巧
  7. eureka-client无法启动com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient
  8. python selenium 保存网页_使用python/selenium保存完整的网页(包括css、图像)
  9. java.io.IOException: Unable to establish loopback connection
  10. 计算机课程成绩认定管理办法,全日制普通本科生课程学分成绩对接认定管理办法...