最近接触了数据结构与算法,这本该是计算机专业的同学大一就掌握的课程,可我现在才算正式接触,感到惭愧万分。但闻道有先后,术业有专攻。本篇博客开始记录本人学习数据结构与算法这门课的点滴,希望自己能坚持下去,不要像记英语单词书一样,每次记到abandon就放弃了。

八皇后问题描述:在8*8的国际象棋棋盘中摆放8个皇后,使其不能相互攻击,即:任意两个皇后都不能处于同一行、同一列、同一斜线上,问有多少种解法?

思路分析:

1.第一个皇后先放在第一行的第一列;

2.第二个皇后放在第二行的第一列,然后判断是否OK,如果不OK,则继续放在第二列、第三列,依次把所有的列都放完,找到一个合适的列;

3.继续第三个皇后,依然是第一列、第二列.....直到第8个皇后也能放在一个不冲突的位置,这算是找到了一个正确解;

4.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯(解释参见文末配图),即将第一个皇后放到第一行第一列的所有正确解全部得到为止;

5.然后回头继续第一个皇后放在第一行的第二列,后面继续循环执行 1,2,3,4步骤

本文用一个一维数组进行求解(数组索引的妙用)

说明:用一个一维数组即可表示棋盘,例如 一种解法为:arr = {0,4,7,5,2,6,1,3},对应的arr下标表示第 (下标+1)行,也表示第 (下标+1)个皇后;

如 arr[i] = val    表示 第(i+1)个皇后 放在第 (i+1) 行, 第 (val+1) 列;

在虚拟机中,引用类型的变量是存放在堆中的,因此在递归时,每个方法共享引用类型的变量,即 array

代码如下:

//八皇后问题的解法
//说明:用一个一维数组即可表示棋盘,例如 一种解法为:arr = {0,4,7,5,2,6,1,3},对应的arr下标表示第 (下标+1)行,也表示第 (下标+1)个皇后
//如 arr[i] = val    表示 第(i+1)个皇后 放在第 (i+1) 行, 第 (val+1) 列
//在虚拟机中,引用类型的变量是存放在堆中的,因此在递归时,每个方法共享引用类型的变量,即 array
public class Queen8 {//定义一个max 表示一共有几个皇后int max = 8;//定义一个数组array, 保持皇后放置位置的结果, 比如arr = {0,4,7,5,2,6,1,3}int[] array = new int[max];static int cnt = 0;public static void main(String[] args){Queen8 queen = new Queen8();queen.check(0); //表示从 第1个皇后开始放System.out.println("一共有解法: " + cnt);}//编写一个方法,放置第n个皇后//注意:check是 每一次递归时,进入到check中都有一套循环 for(int i=0; i<max; i++),因此会有回溯private void check(int n){//先写递归退出条件if(n == max){ // n = 8 时,是第九个皇后,8个皇后已然放好print();return;}//再写靠近递归退出的情况//依次放入皇后 ,并判断是否冲突for(int i=0; i<max; i++){//先把当前皇后n ,放到该行的第1列(此时 i=0)array[n] = i;//判断当放置第n个皇后到 i 列时,是否冲突if(judge(n)){ //说明返回true,与前面的位置不冲突//接着放第n+1个皇后,即开始递归check(n+1); //}//如果冲突(返回false,与前面的位置冲突),就继续该循环,继续执行array[n] = i ; 此时 i++了, 即将第n个皇后,放置在本行的后移的一个位置}}//查看当我们放置第 n 个皇后时,就去检测该皇后是否和前面已经摆放的皇后冲突/*** * @param n 表示第n个皇后,也表示放在 第n+1行上* @return*/private boolean judge(int n){for(int i=0; i<n; i++){//说明:1.array[i] == array[n] 表示判断 第 n 个皇后是否和前面 n-1 个皇后在同一列//2.Math.abs(n-i) == Math.abs(array[n]-array[i]  表示判断 第 n 个皇后是否和第 i 个皇后在同一斜线,斜率//3.此算法,没有必要判断是否在同一列,因为数组索引表示行,肯定不在同一行,n每次都会递增if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n]-array[i])){return false;}}return true;}//打印皇后位置private void print(){cnt++;for(int i=0; i<array.length; i++){System.out.print(array[i] + " ");}System.out.println();}}

最后一共有92种解法。

回溯解释参考如下图:

Java实现八皇后问题的解法(一维数组版本)相关推荐

  1. 算法与数据结构(Java解八皇后问题)

    八皇后问题 思路: 八个皇后互不冲突,即同一行同一列只能出现一位皇后.以行为标准,每一行只能放入一位皇后.可以使用一个一维数组来表示皇后的位置,一维数组的下表表示行数,一维数组中的元素表示列数. in ...

  2. java递归-八皇后问题(回溯算法)

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

  3. 用java实现八皇后问题_使用java语言实现八皇后问题

    八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 解: package eightQuen; / ...

  4. 八皇后问题各种解法分析

    最近学习算法分析,突然对八皇后问题十分感兴趣,下面是我研究一段时间后的思想汇总.希望能够引起各位算法爱好者的共鸣,当然如果有什么遗漏之处希望互相交流. 一:回溯法 这种算法想必学习计算机算法分析与设计 ...

  5. python8皇后不攻击问题_python 八皇后问题的解法(深度搜索)

    共本文介绍如何用深度搜索的方式求解8皇后(其实也可以求解N皇后)问题的解 八皇后问题描述 在国际想起的规则中,皇后能攻击八个方向上的棋子,而且不受距离限制. 皇后的攻击方向如下图所示: 八皇后问题则是 ...

  6. java编写八皇后算法

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

  7. java读入一个不确定长度的一维数组

    在java中常常需要读入一个不确定长度的一维数组. 思路: 用nextLine读入一行,用split根据空格进行分割,然后再把string类型转为int型. 读入不确定长度数组的小例子: Scanne ...

  8. java计算八皇后_八皇后java算法

    public class NQueens {  public static int num = 0; // 累计方案总数 public static final int MAXQUEEN = 5;// ...

  9. 回溯算法解决八皇后问题(JAVA实现)

    送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...

最新文章

  1. 【Android View事件分发机制】原理
  2. linux下防DDOS***软件及使用方法详解
  3. c++ 调用system 不显示黑框_Java回调的四种写法:反射+直接调用+接口调用+Lambda表达式...
  4. jenkins linux虚拟机,Linux系统中jenkins使用的简单介绍
  5. 13.4 MySQL用户管理;13.5 常用sql语句;13.6 MySQL数据库备份恢复
  6. python3爬虫初探(四)之文件保存
  7. CentOS 6.9 搭建 Presto
  8. 3G时代 一起走近无线运维的3A标准——柳州市劳动和社会保障局
  9. mysql数据库怎么读文件_mysql数据库读写文件
  10. 如何理解JavaScript中Object.defineProperty【一】
  11. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计下载v2.3-西西软件下载...
  12. 关于在联想电脑管家更新网卡驱动后无法显示可用网络wifi的问题!
  13. 浪曦视频--工厂方法模式
  14. linux ringbuffer原理,linux内核 使用内核队列实现ringbuffer(续)
  15. 第十一章 枚举与泛型 总结
  16. li 字多出了省略号_css实现DIV,LI等元素超出部分文字用省略号…显示
  17. 阿里开放平台接入——开放平台注册与API调用
  18. #35-【刷题】乐乐的方块
  19. 扬帆优配|太猛了!最高暴拉170%,港股这一板块狂飙!“带货”起飞?
  20. 用JAVA awt实现Image Asset Studio生成圆形或圆角矩形图片功能

热门文章

  1. 关于地理信息系统(GIS)的几个问题
  2. ERP(Enterprise Resource Planning)
  3. AtCoder AGC035E Develop (DP、图论、计数)
  4. wxpython是什么_请问wxpython中 event传递的什么参数?
  5. mysql gbk支持_mysql如何支持gbk编码
  6. wegame饥荒一直连接中_怪诞画风下的异世界生存,一款让你吃到撑的游戏——《饥荒》...
  7. mysql5.6.24配置日志_windows下mysql5.6.x的日志正确配置方法(my.ini) (网上的都是5.6之前的版本)...
  8. 《安全测试指南》——信息收集测试【学习笔记】
  9. 模板 - 数据结构 - ST表 + 二维ST表
  10. 固定顶部指定div不滑动