什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法?

游戏连接: http://www.4399.com/flash/42643.htm#search3

直接上代码:

public class QueueLv8 {
int maxSize =8;
int[] array = new int[maxSize];
static int count = 0;//正解次数
static int okCount = 0;//判断次数 public static void main(String[] args){
//8皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 共有92种摆法 //8皇后问题, 这里使用递归实现, 体现了回溯思想.
//这里使用一维数组来实现,比如: int[8] = {0,4,7,5,2,6,1,3} ,表示:第i+1个皇后,放在棋盘的第i+1行,第 int[i]+1 列. 这里很重要,理解了这里,就能理解后面的算法
// 第1个皇后 放在 第1行 第1列. 第二个皇后放在第2行第5列, 第三个皇后放在第三行第8列...... /**
* 实现思路:
* 1: 先将第一个皇后 放在第一行第一列的位置上
* 2: 再将第二个皇后 放在第二行的第一列位置上, 判断是否满足规则, 如果不满足, 将该皇后放到 第二行第二列位置上,判断是否满足规则, 依次将这个皇后放到第3列, 第四列,,,,第8列位置上,直到找到一个合适位置
* 3: 再将第三个皇后 放到第三行的 第一列,,第二列,第三列,,,直到找到合适位置
* 4: 直到将第8个皇后, 放到第8行的合适位置上,后, 此时算是找到一个正确的解.
* 5: 当得到一个正确解时候,开始回溯,回退到上一行,将该行皇后位置向后一列移动,判断是否满足规则,,,, 最终回溯到第一行,将第一列位置时的全部正确解都拿到,然后第一行第一列该皇后位置,变为第二列,第三列,,,第8列, 此时得到所有的正确解
*/ QueueLv8 queue8 = new QueueLv8();
queue8.getQueue8Res(0);
System.out.printf("8皇后总共有%d种摆法\n",count);
System.out.printf("总共判断次数为:%d",okCount);
} //写一个方法, 用来放置第 n 个皇后
public void getQueue8Res(int n){//n表示第n个皇后,也表示第n行, 为0时表示,放置第一个皇后,在第一行,第一列上, 为1表示,放在第二行,第一列上
//是否已完成
if(n == maxSize){//当为8 时, 说明要放置第9个皇后了,已结束
print();
return;
} //一进来这里是 0-8的循环,就说明,每个棋子,都要从第1列到第8列移动,从而找到合适位置
for (int i = 0; i < 8; i++) {
//先将这个皇后放在第1列上
array[n] = i;
//判断是否符合规则
if(IsOk(n)){
//为true 表示 符合规则, 不在同一行,同一列,同一斜线
getQueue8Res(n+1);
}
//如果不符合规则,在同一行,或同一列,或同一斜线, 此时i++, 表示将该皇后放到下一列,再判断是否符合规则
} } //判断是否满足规则, 其实就是判断 这个棋子,和之前的棋子,是否同一行,同一列,是否同一斜线
public boolean IsOk(int n){//n 表示第n个皇后, 同时n 也表示了行数,n始终在变,所以不用判断是否在同一行
okCount++;
for (int i = 0; i < n; i++) {
//判断是否在 同一列, array[n] == array[i] 这个代码表示, 在这个皇后和 之前的0到n-1个皇后中有一个是在同一列, 比如int[8] = {0,4,0,5,2,6,1,3} ,第3个皇后和 第1个皇后就在同一列, n=2, i=0 array[n] == array[i]
//判断是否在 同一斜线, Math.abs(n-i) == Math.abs(array[n] - array[i]) ,这行代码表示,这个皇后和 之前的之前的0到n-1个皇后中有一个是在同一斜线. 比如int[8] = {0,4,2,5,2,6,1,3} 第3个皇后和 第1个皇后就在同一斜线上, 此时 n = 2, i = 0 ,Math.abs(2-0) == Math.abs(array[2] - array[0]) 成立, 用的是绝对值,所以不管是正斜线,还是反斜线都是成立的, 还可以将他理解成 等边直角三角形的 二个边是相等的,所以在同一斜线上
if(array[n] == array[i] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
return false;
}
}
return true;
} public void print(){
count++;
for (int i = 0; i < array.length; i++) {
System.out.printf(array[i]+" ");
}
System.out.println();
}
}

测试结果:









从这个结果是可以看出来 : 他是先找到 第一行第一列棋子所在位置的所有正解,之后, 再得到第2列,,,第三列,,第八列

7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯的更多相关文章

  1. Java数据结构和算法(八)--红黑树与2-3树

    红黑树规则: 1.每个节点要么是红色,要么是黑色 2.根节点都是黑色节点 3.每个叶节点是黑色节点 3.每个红色节点的两个子节点都是黑色节点,反之,不做要求,换句话说就是不能有连续两个红色节点 4.从 ...

  2. Java数据结构和算法 - OverView

    Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必 ...

  3. 【学习总结】java数据结构和算法-第一章-内容介绍和授课方式

    总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 几个经典算法面试题 算法和数据结构的重要性 几个经典算法面试题 字符串匹配 暴力法:慢 kmp算法:更 ...

  4. Java数据结构和算法

    首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...

  5. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  6. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  7. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

  8. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

  9. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

随机推荐

  1. 逆向 stdio.h 函数库 fwrite 函数(调试版本)

    0x01 fwrite 函数 函数原型: size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 函数功能:把 ...

  2. 12.PHP_PDO数据库抽象层

    PDO数据库抽象层 其实也就是说,为了方便PHP项目各种数据库切换的方便以及代码兼容性,再各种数据库上又封装了一层,做成了统一的接口,方便数据库使用和切换. PDO链接mysql数据库: <?p ...

  3. 寻找OEP

    1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:"在数据窗口中跟随",到内存数据窗口,将内存数据窗口以HEX数据形式显示,在刚才的 ...

  4. 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)

    五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...

  5. flex布局的使用

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{ disp ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定

    如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...

  7. 腾讯暑期 前后七面 + hr(已拿offer面经)

    以下是时间线 魔方 魔术师工作室 3.19 一面(120mins) c++ struct和union区别? 指针和引用的区别? 左值和右值? 字节对齐的作用? 什么情况下需要自定义new? mallo ...

  8. algorithm库介绍之---- stable_sort()方法 与 sort()方法 .

    文章转载自:http://www.cnblogs.com/ffhajbq/archive/2012/07/24/2607476.html 关于stable_sort()和sort()的区别: 你发现有 ...

  9. C++ primer plus读书笔记——第1章 预备知识

    第1章 预备知识 1. Ritchie希望有一种语言能将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起,于是他在旧语言的基础上开发了C语言. 2. 在C++获得一定程度的成功后,S ...

  10. Java_集合之三

    1.红黑树 1.1概述[理解] 红黑树的特点 平衡二叉B树 每一个节点可以是红或者黑 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的 红黑树的红黑规则有哪些 每一 ...