游戏地址自己写完了可以根据结果去测试一下。

算法分析

八皇后问题算法思路分析

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

说明:理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题. arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3} //对应arr 下标 表示第几行,即第几个皇后,arr[i] = val , val 表示第i+1个皇后,放在第i+1行的第val+1列

实现代码

1)判断是否冲突

    //查看当我们放置第n个皇后,就去检测该皇后和前置的皇后是否冲突public static boolean judge(int n){for (int i = 0; i < n; i++){//下面判断是,在同一列 或者 在同一斜线上,abs是取绝对值if (array[n] == array[i] || Math.abs(array[n] - array[i]) == Math.abs(n - i)){return false;}}return true;}

2)主要逻辑(递归与回溯)

    // n 代表第几行public static void check(int n) {if (n == max) {//也就是0-7八个皇后都放置好了//输出当前的 一个解for (int i = 0; i < max; i++) {System.out.print(array[i] + " ");}System.out.println("");count ++;return;}//开始放置循环每行的位置for (int i = 1;i < max+1; i++){//赋值,也就是赋纵坐标位置array[n] = i;//判断是否冲突if (judge(n)){ //如果不冲突check(n+1); //就放置下一个位置}}}

全部代码

package DataStructures.sparsearray;/*** 简单的实现八皇后问题(没有贪心算法优化)*/
public class queue8 {static int max = 8;static int[] array = new int[max];static int count = 0;public static void main(String[] args) {//定义一个max表示一共有多少个皇后//定义一位数组,用下标+1来表示行,用值来表示纵坐标,比如array{1,5,8,6,3,7,2,4}//测试check(0);System.out.println("总共有:"+ count+"次解");}//1.第一个皇后先放第一行第一列
//2.第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适
//3.继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解
//4.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.
//5.然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4的步骤//编写一个方法//n 代表第几行public static void check(int n) {if (n == max) {//也就是0-7八个皇后都放置好了//输出当前的 一个解for (int i = 0; i < max; i++) {System.out.print(array[i] + " ");}System.out.println("");count ++;return;}//开始放置循环每行的位置for (int i = 1;i < max+1; i++){//这里循环就把一行的每个位置都判断一次,在回溯回来后进行判断在执行check//赋值,也就是赋纵坐标位置array[n] = i;//判断是否冲突if (judge(n)){ //如果不冲突check(n+1); //就放置下一个位置}}}//查看当我们放置第n个皇后,就去检测该皇后和前置的皇后是否冲突public static boolean judge(int n){for (int i = 0; i < n; i++){//下面判断是,在同一列 或者 在同一斜线上,abs是取绝对值if (array[n] == array[i] || Math.abs(array[n] - array[i]) == Math.abs(n - i)){return false;}}return true;}}

最后结果是92种

数据结构 - 递归 回溯算法(八皇后问题)相关推荐

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

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

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

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

  3. 回溯算法(八皇后问题)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  4. 分治回溯算法----八皇后问题

    八皇后问题:在一个8×8的棋盘中,放入8个皇后棋子,要求同行同列同斜线不能有重复的皇后棋子,八皇后问题一共有92种解法.如图所示:即八皇后问题的一个解. //分治回溯算法解决八皇后问题 public ...

  5. 学习笔记-回溯算法(八皇后问题)暴力法

    八皇后问题暴力解决法(介绍代码有说明) 先展示结果: 我这里用的是一维数组来展示的结果 array={7,3,0,2,5,1,6,4} 7的下标为0, 在这里下标+1表示的是第几个皇后也是行的位置,a ...

  6. 【算法】递归|迷宫回溯问题|八皇后问题

    [算法]递归|迷宫回溯问题|八皇后问题   迷宫回溯问题,要用动态的眼光来看待这个递归算法. package com.serein.recursion;/*** @author baichuan* @ ...

  7. 回溯算法n皇后问题_使用回溯算法的N Queen问题和解决方案

    回溯算法n皇后问题 N-皇后问题 (N - Queen's problem) The n – queen problem is the generalized problem of 8-queens ...

  8. 【Java数据结构与算法】第五章 递归、迷宫回溯和八皇后问题

    第五章 递归 文章目录 第五章 递归 一.递归 1.概念 2.代码实现 3.递归的规则 二.迷宫回溯 1.要求 2.代码实现 三.八皇后问题 1.介绍 2.思路 3.代码实现 一.递归 1.概念 简单 ...

  9. 数据结构与算法-- 八皇后问题(多种实现方案)

    八皇后问题解法一(排列筛选法) 本篇我们承接上一篇中的思想,想到了一个经典的算法题,八皇后问题: 题目:在8*8的国际象棋上摆放8个皇后,使得其互相不能攻击,即任意两个换后不能在同一行,同一列,或者同 ...

最新文章

  1. java script jquery_Java Script 学习笔记 -- jQuery
  2. 解题报告 『[NOI2014]起床困难综合症』
  3. JavaScript 中的代码小技巧
  4. java实现打印等腰三角形
  5. 将EntityManager.refresh添加到所有Spring数据存储库
  6. Docker : 数据卷(创建、挂载、查看、删除)
  7. python 案例串接_Python基础系例--字典串操作
  8. Python小应用1 - 抓取网页中的链接地址
  9. c语言程序设计何钦铭颜晖pdf,C语言程序设计(第3版)何钦铭颜晖第12章文件.pdf
  10. 常见的预测模型及算法
  11. 【渝粤题库】国家开放大学2021春4990电子商务概论(农)题目
  12. 文菌装NAS E5:超详细!手把手教您安装黑群晖918+6.2保姆级教程
  13. 服务器扩容申请文档,服务器扩容操作
  14. Unity.TimeLine
  15. 电脑出现missing operating system解决办法
  16. 第五届“强网”拟态防御国际精英挑战赛——线上预选赛火热开赛!
  17. UG NX二次开发(C#)-装配-删除阵列矩阵
  18. PX4飞行模式-多旋翼
  19. java数组显示_Java 1.5中显示数组
  20. plt.text() 函数

热门文章

  1. electron知识点
  2. 3、C#面向对象:封装、继承、多态、String、集合、文件(下)
  3. Ubuntu apache 禁止目录浏览
  4. [Bugku][Web][CTF] 16-29 write up
  5. [leedcode][JAVA][365][BFS]
  6. java xpath 解析xml_使用XPATH解析XML文件
  7. iptables nat实验_【零基础学云计算】LVS负载均衡群集之NAT模式搭建 (实践篇)...
  8. 注册登录页面代码用js判断是否填入信息_php实现登录功能
  9. linux边看系统信息,Linux查看系统信息大全[备忘]
  10. c语言凸包算法,基于C语言的凸包算法实现