八皇后问题

思路:

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

    int[] posQueen = new int[maxQueen];// posQueen = {0, 4, 7, 5, 2, 6, 1, 3} 表示在第一位皇后在第1行, 第1列;第二位皇后在第2行,第5列,以此类推...

当放入第n位皇后时,前面(n-1)行已经有皇后了,所以需要判断第 n 位皇后是否与前(n-1)位冲突。所以需要有一个检测冲突的函数:

    //检测第n个皇后是否和前面冲突private boolean check(int n) {for (int i=0; i<n; i++) {if (posQueen[n] == posQueen[i] //在同一列||Math.abs(n-i) == Math.abs(posQueen[n]-posQueen[i])) //在正、反对角线上{ return false;}}return true;}

写好了检测冲突方法,就可以考虑开始放入皇后了,在这里用递归可以找出所有的可行解:

    //放置第n个皇后private void place(int n) {//检测是否所有皇后已放好if (n==8) {count++;display();return;}//依次放入皇后,并判断是否冲突for(int i=0; i<maxQueen; i++) {//先把当前皇后放在第1列posQueen[n] = i;//判断是否冲突if (check(n)) {//不冲突,进入下一层place(n+1);} //冲突,检查本行的下一个位置是否可行,即进入for循环的下一位}}

以5皇后举例说明:

这个方法需要输入当前第几个皇后正在被放置,在开始时我们会输入0(也就是放置第1位皇后)。

  1. 首先会检测5位皇后是否已经被放好,否,进行下一步,将第1位皇后放在第1行的第1列上,用{0,0,0,0,0}表示此时的状态;
    然后判断是否冲突,否,进入下一层循环,放置第2位皇后;
  2. 先检测5位皇后是否都被放好,否,将第2位皇后放在第2行第1列上,冲突;
    将第2位皇后右移一位,放在第2行第2列上,冲突;
    将第2位皇后右移一位,放在第2行第3列上,不冲突,此时状态为{0,2,0,0,0}
    进入下一层循环,放置第3位皇后;
  3. 先检测5位皇后是否都被放好,否,将第3位皇后放在第3行第1列上,冲突;
    将第3位皇后右移一位,放在第3行第2列上,冲突;

    将第3位皇后右移一位,放在第3行第5列上,不冲突,此时状态为{0,2,4,0,0}
    进入下一层循环,放置第四位皇后;
  4. 同理,状态为{0,2,4,1,0},进入下一层循环,放置第5位皇后;
  5. 同理,当for循环到i=4时,状态为{0,2,4,1,3},第5位皇后不冲突,进入下一层循环;
  6. 因为5位皇后都已经被放置好,因此 if 检测为 true,输出第一组合理排列;
    返回到上一层循环中,即回到第5步,并继续第5步(因为上一次第5步只检查到第5行第4列);
  7. 直接从for循环的i=5开始,将第5位皇后放在第5行第5列上,冲突;
    这一轮搜索结束,退回上一层,即第4步,从for循环的i=2开始,重复上述过程;
  8. 直到返回第1步,从for循环的i=1开始,重复第2-7步
  9. 最终会遍历所有位置,找出所有的组合方式

图解:

先从最后一行开始遍历;然后回到上一行,遍历;直到回到第一行

完整代码

public class Queen {//皇后的数量int maxQueen = 5;//皇后的位置数组,例:{0, 4, 7, 5, 2, 6, 1, 3}int[] posQueen = new int[maxQueen];//解法总数量int count = 0;//检测第n个皇后是否和前面冲突private boolean check(int n) {for (int i=0; i<n; i++) {if (posQueen[n] == posQueen[i] || Math.abs(n-i) == Math.abs(posQueen[n]-posQueen[i])) {return false;}}return true;} //放置第n个皇后private void place(int n) {//检测是否所有皇后已放好if (n==maxQueen) {count++;display();return;}//依次放入皇后,并判断是否冲突, i表示当前皇后放置在第n+1行第i+1列for(int i=0; i<maxQueen; i++) {//先把当前皇后放在第1列posQueen[n] = i;//判断是否冲突if (check(n)) {//不冲突,进入下一层place(n+1);} //冲突,检查本行的下一个位置是否可行,即进入for循环的下一位}} //打印结果private void display() {System.out.println("第"+count+"种解法:");int[][] result = new int[posQueen.length][posQueen.length];for(int i=0; i<posQueen.length; i++) {result[i][posQueen[i]] = 1;for (int j=0; j<posQueen.length; j++) {System.out.print(result[i][j]+" ");}System.out.println();   }}public static void main(String[] args) {Queen queen = new Queen();queen.place(0);System.out.println(queen.maxQueen+"皇后问题一共有"+queen.count+"种解法。");}}

相关章节
第一节 简述
第二节 稀疏数组 Sparse Array
第三节 队列 Queue
第四节 单链表 Single Linked List
第五节 双向链表 Double Linked List
第六节 单向环形链表 Circular Linked List
第七节 栈 Stack
第八节 递归 Recursion
第九节 时间复杂度 Time Complexity
第十节 排序算法 Sort Algorithm
第十一节 冒泡排序 Bubble Sort
第十二节 选择排序 Select Sort
第十三节 插入排序 Insertion Sort
第十四节 冒泡排序,选择排序和插入排序的总结
第十五节 希尔排序 Shell’s Sort
第十六节 快速排序 Quick Sort
第十七节 归并排序 Merge Sort

算法与数据结构(Java解八皇后问题)相关推荐

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

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

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

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

  3. java编写八皇后算法

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

  4. Java实现八皇后问题的解法(一维数组版本)

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

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

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

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

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

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

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

  8. 穷举法解八皇后问题和凑硬币问题

    八皇后问题 (英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意 ...

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

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

最新文章

  1. 自然语言处理(NLP)之从文本中提取时间
  2. mac pro下安装gdb和delve调试器
  3. RecyclerView嵌套TextView时显示文字不全的解决方法之一
  4. synchronized(二)
  5. V-rep学习笔记:机器人模型创建2—添加关节
  6. 如何在有scoped不影响elementUI 的其他页面组件,进行单页面修改的几种方法。
  7. NSubstitute完全手册(一)入门基础
  8. Android之Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE问题解决
  9. C++关键字--volatile
  10. Acwing第 34 场周赛
  11. 郝斌数据结构与算法自学视频教程
  12. 广数25i系统倒刀回刀m代码_广数系统指令
  13. 医惠护理系统服务器错误,医惠智能云随访系统
  14. Excel打开CSV文件,数字起始0丢失问题
  15. 漫步数理统计二十五——正态分布
  16. 『时代』杂志:元宇宙将改变世界;健身教练:AI让我丢工作!有话说北欧人工智能夏令营资料大公开;深度学习书籍TOP5 | ShowMeAI资讯日报
  17. [原创] poi-tl 合并word文档 (使用NiceXWPFDocument)
  18. ubuntu18.04设置中文(简体)
  19. python中entry是什么意思_python中entry用法讲解
  20. ubuntu安装python3.6失败 出现403 Forbidden错误

热门文章

  1. java request 原理_JavaWeb-seession原理
  2. 怎么将零件整合到一起_Fraunhofer ILT用于大型零件3D打印的“边飞行边加工”的LPBF概念...
  3. dailykt爬取tushare 数据存入本地mysql
  4. tensorboard 远程
  5. pyspark github算例 计算平均数
  6. 圆弧与直线相切画法_数控编程基础,相切圆弧的基点计算方法
  7. python必须连网开发吗_Python开发,请避开这些坑!
  8. 在数组中找到一个局部最小的位置
  9. 文巾解题 704. 二分查找
  10. python 笔记:if __name__==‘main’