(Java实现) N皇后问题
n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行、纵行或斜线上。
蛮力法思想:
解决n皇后问题的思想本质上就是蛮力法,生成所有可能的摆放情况,并判断该情况是否满足要求,我们以树结构来表示解决问题的方法。以4*4的棋盘为例,第0层的根节点为空白的棋盘,第1层为只在棋盘的第一行摆放的四种不同情况,第2层是在第1层的基础上,摆放第二行的棋子,最后的叶子结点便是所有可能的完整摆放情况,共256种,但加上中途生成的不完整情况共1+4+16+64+256=340种。

回溯法思想:
回溯法其实是以蛮力法为基础,只是不需要生成所有的情况,我们可以发现,在整棵树中,有些棋盘的摆放情况在未达到叶子结点时,便已经不满足n皇后的条件了,那么我们就没有必要再去往下摆放棋子(生成下一层的结点),而是直接回到该结点的父节点,生成新的情况进行判断。通过这种方法可以减少生成完全树中的一些不必要的子树,我们称之为“剪枝”。具体实现中回溯法与蛮力法的主要区别在于判断棋盘的代码所在的位置,蛮力法在摆放完所有皇后后再判断,回溯法在每摆放好一个皇后时就进行判断。

具体实现:
根据n皇后问题的规模,创建大小为n的数组代替树结构,使其下标代表行数,内容代表列数,数组中的每个数必定位于不同的行,数组内容不同证明两个元素位于不同的列,两数下标的差的绝对值不等于两数内容的差的绝对值,表示两数不位于同一斜线上。
import java.util.Arrays;
import java.util.Scanner;
public class Nhuanghouwenti {
private static int queenNum;//皇后的个数
private static int[] hash;//下标表示i号皇后(皇后i放在第i行)value表示放的列号
private static int count = 0;//合法摆放方式的个数
public static void placeQueen(int m) {
if (m > queenNum) {//如果摆到了n+1行了,说明前n行都是不冲突的,合法的
count++;
for (int i = 1; i <=queenNum; i++) {
System.out.print(hash[i]);
}
System.out.println();
// System.out.println(Arrays.toString(hash));
//打印合法的摆放结果
// for(int i = 1; i <= queenNum; i++){
// int column = hash[i];//hash值表示皇后i所在的列号
// for(int j = 1; j <= queenNum ;j++){
// if(j!= column){
// System.out.print("* ");
// }else{
// System.out.print("Q ");
// }
// }
// System.out.println();
// }
return;
}
for (int i = 1; i <= queenNum; i++) {
//check the column is conflict with former ones or not
//if so, check the next column until find a non-conflict column
//or until the last column ,return;
if (isConfilct(m, i)) {
continue;
} else {//如果检测到第i列不冲突,是安全的,
hash[m] = i;//将皇后m放在第i列
placeQueen(m + 1);//再放皇后m+1,
//如果皇后m+1放完并返回了
//两种可能:
//1:冲突,返回了
//2.一直将所有的皇后全部放完并安全返回了
//将皇后m回溯,探索新的可能或者安全的位置
hash[m] = -1;
//其实这里没必要将m重新赋值的,因为检测到下一个
//安全位置的时候会把hash[m]覆盖掉的
//但是为了更好的体现“回溯”的思想,在这里画蛇添足了
}
}
}
/**
* 检测冲突
* @param index
* 表示行号
* @param hash 表示第i行放置皇后的列数
* 值表示列号
* @return
*/
private static boolean isConfilct(int row, int column) { //一行一个皇后,第n个皇后也代表着第n行
if(row == 1){//第1行永远不会冲突
return false;
}
//只需要保证与那些已经就位的皇后不冲突即可
for (int i = 1; i < row; i++) { //当前的行数
if (hash[i] == column || ( column - row) == (hash[i] - i) || (row - column)== (i-hash[i]) //以前行数减列数与现在的是否相等
|| (row + column) == (hash[i] + i)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
queenNum = sc.nextInt();
hash = new int[queenNum + 1];
for (int i = 0; i < hash.length; hash[i++] = -1);//初始化棋盘
placeQueen(1);
System.out.println(count);
}
}
(Java实现) N皇后问题的更多相关文章
- Java实现八皇后
实验题目 回溯法实现8皇后问题 实验要求 a.掌握递归回溯算法的基本思想. b.学习掌握应用面向对象通用回溯程序框架解决实际问题. 提高面向对象编程的技能. 作业描述:在8*8格的棋盘上放置 ...
- 易理解java代码8皇后问题
马上就要蓝桥杯比赛了,我这些算法还是不会,确实有点慌,今天一天早上睡到很晚不愿起床,然后才开始研究8皇后问题.这也是典型的回溯与递归问题.其实本质上和马踏棋盘问题非常类似,八皇后问题呢,就是要判断主对 ...
- java实现八皇后问题(递归和循环两种方式)
循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVA ...
- 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题
两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...
- 2018.4.24 java实现8皇后算法
import java.util.Scanner; public class Nqueens { private boolean verify(int[] arr,int i) { // TODO A ...
- JAVA实现N皇后问题(回溯法)
package com.leetCode; /** * Follow up for N-Queens problem. Now, instead outputting board configurat ...
- n皇后2种解题思路与代码-Java与C++实现
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了n皇后问题的解题思路,并分别用java和c++实现了过程,最后,对于算法改进 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 八皇后java算法
import java.util.Date; public class EightQueen { public static void main(String[] args) { long star ...
随机推荐
- 把99%的程序员烤得外焦里嫩的JavaScript面试题
最近有学员给出一段令人匪夷所思的JavaScript代码(据说是某某大厂面试题),废话少说,上代码: var a = 10; { a = 99; function a() { } a = 30; ...
- ASP.Net Core中使用Swagger
我们先简单介绍下什么是Swagger,主要是用来干嘛?? 在Swagger诞生之前,我们通常在开发接口的过程中,需要前后端共同维护一个接口文档,然后大家按照接口文档的规范进行对接.接口文档俨然成了接口 ...
- Mac 安装实用开发软件和日常软件清单
软件安装 开发需要安装软件 HomeBrew 这个是 mac 的软件包管理软件,类似于 yum 安装 rpm 包会帮我们处理软件包之间的依赖关系一样,或者 apt-get 安装 deb 包,最开始接触 ...
- 08JAVA基础关键字(final、static)以及抽象类和接口
一.关键字 1.final 修饰类 修饰变量 修饰成员方法 该类为最终类,不能被继承 该变量为常量 该成员方法不能被重写 2.static (1).生命周期 随着类的加载而加载 (2).特点 被本类所 ...
- 关于jquery 项目中文件上传还有图片上传功能的尴尬???
做项目需要兼容IE8,所以找了好久,都没找到合适的希望有大神能够解惑!!! 要求是兼容IE8,在选完图片直接自动上传,有进度展示,并有成功的标记,下面的选择文件也是一个input file 选择完自动 ...
- Java基础之值传递
一.传递类型 我们从c语言开始学习程序设计语言时就知道,参数的传递类型一般有两种:值传递和引用传递.那么什么是值传递什么是引用传递呢? 值传递:指在调用方法时将实际参数的值拷贝一份传递给方法,这样方法 ...
- SSH_ProductCRUD的项目结构与配置文件
项目结构 各类配置文件 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hib ...
- SQL——SQL日期
SQL日期 MySQL: NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DAT ...
- element 的 Cascader 级联选择器设定默认值
Cascader 级联选择器 发现在很多的CRM管理系统里面,都有不少页面是用到这种级联选择器的,确实,功能很实用, 不过要设置默认值则应该让不少人头痛,因为你选择的时候 @change 事件的参数就 ...
- HTML特殊符号整理
往网页中输入特殊字符,需在html代码中加入以&开头的字母组合或以&#开头的数字.下面就是以字母或数字表示的特殊符号大全. ...