八皇后问题--全排列法[Java]
来源:互联网 发布:日本犯罪推理知乎 编辑:程序博客网 时间:2024/05/01 06:32
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n≥ 4 时问题有解。
import java.util.ArrayList;/** * 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后? * 为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 * 八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。 * 当且仅当 n = 1 或 n≥ 4 时问题有解。 */public class EightQueens { public static void main(String[] args) { int number = 8; System.out.println(new EightQueens().eightQueens(number)); } public int eightQueens(int number) { if ((number < 1) || (number > 1 && number < 4)) { return 0; } // 由于八个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占据一行。 // 我们定义一个数组columnIndex[8],分别用 0 ~ 7 初始化。 // columnIndex[i] : 第i行皇后的列号 即columnIndex[2] = 2 表示第2行皇后所在的列号为2 int[] columnIndex = new int[number]; for (int i = 0; i < number; i++) { columnIndex[i] = i; } //对数组全排列 ArrayList<ArrayList<Integer>> result = permutation(columnIndex); // 因为用不同的数字初始化数组,所以 任意 两个皇后肯定不同列。 // 只需判断每一个排列对应的8个皇后是不是在同一个对角线上 // 即对数组i和j,判断i - j = columnIndex[i] - columnIndex[j] 或者 i - j = columnIndex[j] - columnIndex[i] for (int i = 0; i < result.size(); i++) { if (diagonal(result.get(i))) { result.remove(i); --i; } } System.out.println(result); return result.size(); } /** * 判断任意两个元素是否处于对角线位置 * @param list * @return */ private boolean diagonal(ArrayList<Integer> list) { for (int i = 0; i < list.size() - 1; i++) { for (int j = i + 1; j < list.size(); j++) { //如果有 任意 两个元素在对角,则返回true if (i - j == list.get(i) - list.get(j) || i - j == list.get(j) - list.get(i)) { return true; } } } return false; } /** * 数组全排列 * @param nums * @return */ public ArrayList<ArrayList<Integer>> permutation(int[] nums) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); //result:[] result.add(new ArrayList<>()); //result:[[]] for (int i = 0; i < nums.length; i++) { ArrayList<ArrayList<Integer>> current = new ArrayList<>(); for (ArrayList<Integer> element : result) { for (int j = 0; j < element.size() + 1; j++) { element.add(j, nums[i]); ArrayList<Integer> temp = new ArrayList<>(element); current.add(temp); element.remove(j); } } result = new ArrayList<>(current); } return result; }}
阅读全文
0 0
- 八皇后问题--全排列法[Java]
- 八皇后问题的全排列解法
- 八皇后问题和字符串全排列
- 全排列方法求解八皇后问题
- 八皇后问题的全排列解法
- 《编程之法》1.3字符串的全排列,组合,重复排列,八皇后问题
- java实现八皇后的排列问题
- 字符串数组的全排列到八皇后问题详解
- 字符串数组的全排列到八皇后问题详解
- 利用全排列八皇后问题的一种解法
- 运用全排列的方法解决八皇后问题
- 全排列与八皇后的转化
- Java常用算法——搜索(dfs) & 回溯(全排列、八皇后、分苹果问题的详细解析)
- 全排列问题、八皇后问题、组合问题的递归解法
- 利用全排列算法八皇后问题和正方体摆数使三组面顶点之和相等问题
- 八皇后问题(排列+递归+剪枝=回溯法)
- 八皇后问题 --java
- 【java】八皇后问题
- ubuntu 基本命令-开启root登陆、设置root密码、配置镜像源
- Android Studio 构建包名提示错误
- Image-Loader详解
- 用easyUI中的datagrid想在修改完成后页面还停留在当前页面 而且页面没有明显的刷新
- 基于TCP的服务器/客户端通信
- 八皇后问题--全排列法[Java]
- CSDN日报20170525 ——《狗蛋的寻亲之路,结识嵌入式世界的那只狗》
- splunk学习笔记——正则表达式
- android Data Binding 入门
- spring_Spring+Hibernate_使用Annotation进行声明式事务管理
- SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤
- 静态代理&动态代理
- 关于数据库主键和外键
- 怎样才是一个基础水平与进阶水平的Java程序员