目录

1 问题描述

2 解决方案

 


1 问题描述

把n个皇后放在一个n*n的棋盘上,使得任何两个皇后都不能相互攻击,即它们不能同行,不能同列,也不能位于同一条对角线上。


2 解决方案

本文采用全排列的方法,从n个皇后的全排列中寻找符合规则的皇后排列。

为什么这里是说 全排列呢?因为在N皇后问题中,棋盘每一行只准放一个皇后,且每一行的皇后必定要选一列。这个问题就相当于求取1~N个数字的全排列,假设全排列中一种排列方案中第一个数为x,则在棋盘第一行位置为第x列放一个皇后,其第i个位置的数y就为棋盘第i行的第y列放着一个皇后。

那么既然全排列能够得到,就要除去其中不符合条件的排列情况,此时只需要给相应排列加一个判断条件即可,符合条件的就输出这个排列,否则进入下一个排列判断。

具体代码如下:

package com.liuzhen.chapter12;

public class QueenProblem {
public static int count = 0;
//n皇后问题中皇后摆放位置满足的限制条件,若满足则返回true,否则返回false
public boolean isOk(int[] result, int step) {
for(int i = 0;i < step;i++) {
for(int j = i + 1;j < step;j++) {
int left = i - j;
int right = j - i;
if(result[j] == result[i] + left || result[j] == result[i] + right)
return false;
}
}
return true;
}
//交换数组A中m位置和n位置上的值
public void swap(int[] A, int m, int n) {
int temp = A[m];
A[m] = A[n];
A[n] = temp;
} public void printResult(int[] A, int step) {
if(step == A.length) {
count++;
for(int i = 0;i < A.length;i++)
System.out.print(A[i]+" ");
System.out.println();
return;
} else {
for(int i = step;i < A.length;i++) {
swap(A, i, step); //执行回溯前的移位
if(isOk(A, step + 1))
printResult(A, step + 1);
swap(A, i, step); //如果不满足条件或者已经完成一种方案,进行回溯处理
}
}
} public static void main(String[] args) {
QueenProblem test = new QueenProblem();
int[] A = {1,2,3,4};
test.printResult(A, 0);
System.out.println("符合n皇后排序条件的排序方式个数为:"+count);
}
}

运行结果:

2 4 1 3
3 1 4 2
符合n皇后排序条件的排序方式个数为:2

参考资料:

1.n皇后问题

算法笔记_072:N皇后问题(Java)的更多相关文章

  1. 算法笔记_023:拓扑排序(Java)

    目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...

  2. 算法笔记_228:信用卡号校验(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证 ...

  3. 算法笔记_138:稳定婚姻问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...

  4. 算法笔记_137:二分图的最大匹配(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...

  5. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  6. 算法笔记_040:二进制幂(Java)

    目录 1 问题描述 2 解决方案 2.1 从左至右二进制幂 2.2 从右至左二进制幂   1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次 ...

  7. 算法笔记_014:合并排序(Java)

    1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...

  8. 算法笔记_233:二阶魔方旋转(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下:x轴正向:绿x轴 ...

  9. 算法笔记_227:填写乘法算式(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 观察下面的算式: * * × * * = * * * 它表示:两个两位数字相乘,结果是3位数.其中的星号(*)代表任意的数字,可以相同,也可以不同, ...

随机推荐

  1. 树形DP题目集合

    [树形DP](https://cn.vjudge.net/contest/123963#overview) #include<cstdio> #include<string> ...

  2. 洛谷P1196 [NOI2002] 银河英雄传说

    #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #includ ...

  3. npp插件-NewFileBrowser:自定义模板

    ☞ 概述 NewFileBrowser用于定义文件的初始化文本.当我们创建一个jsp文件,或者spring bean的配置文件,或者maven的pom文件... 总有一些内容是固定的:把这些内容建立成 ...

  4. Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)

    题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...

  5. 在CentOS6或RHEL6恢复上ext4文件系统误删除的文件

    首先说明: [root@CentOS6 ~]# rm -rf / //这条命令不可以执行 [root@CentOS6 ~]# rm -rf /* //这条命令可以执行,别去试 ext4文件系统上误删除 ...

  6. UML对象图、包图

    对象图(Object Diagram)显示了一组对象和他们之间的关系.使用对象图阿狸说明数据结构,类图中的类或组件等实例的快照.对象图和类图一样,反应了系统的静态过程,但它是以实际的或原型化为基础来表 ...

  7. 【最小割】【Dinic】Gym - 101201G - Maximum Islands

    题意:方格内有些位置是水域,有些位置是陆地,有些位置是被云彩遮挡住了:让你自己规定被云彩遮挡住的地方是陆地还是水域,使得陆地个数最多.(均为四连通块) 显然与陆地邻接的云彩填成水比较优.其他云彩格子填 ...

  8. 【推导】【暴力】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) C. Five Dimensional Points

    题意:给你五维空间内n个点,问你有多少个点不是坏点. 坏点定义:如果对于某个点A,存在点B,C,使得角BAC为锐角,那么A是坏点. 结论:如果n维空间内已经存在2*n+1个点,那么再往里面添加任意多个 ...

  9. 【最大流】BZOJ1305-[CQOI2009]dance跳舞

    [题目大意] 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢 ...

  10. Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) F. Double Knapsack 鸽巢原理 构造

    F. Double Knapsack 题目连接: http://www.codeforces.com/contest/618/problem/F Description You are given t ...