每周算法练习——n皇后问题
时间:2022-05-04
本文章向大家介绍每周算法练习——n皇后问题,主要内容包括一、八皇后问题的描述、二、求解思路、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、八皇后问题的描述
八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。(摘自维基百科)
其实这里是作为我的一个算法练习,在以前的学习中,我曾经使用过GA算法实现过八皇后问题,主要的思路是将八皇后问题转化成为一种组合优化问题,设置在不同情况下的适应值的大小,当然,在组合中有重复的和在对角线上的被视为不符合要求的,假设设计的是求问题的最小值,那么此时的适应值便会设计得很大,这样便不会选择这样的解。在以后的更新中我会将那部分程序和原理更新到这个平台上。
二、求解思路
在这里,主要是使用最原始的方式求解。其实八皇后问题或者n皇后问题可以通过深度优先搜索(DFS)的方式求解。
(摘自:http://blog.sina.com.cn/s/blog_eb52001d0102v284.html)
所以此时就可以使用递归的方式去查询。这是个简单的问题,我是拿来练手的。。。顺便充一篇博文,这样是不是不好。。。
Java代码:
package org.algorithm.nqueens;
import java.util.ArrayList;
import java.util.Iterator;
/**
* 用深度优先搜索查找N皇后问题
*
* @author dell
*
*/
public class SolveNQueens {
public static void main(String args[]) {
ArrayList<Integer> array = new ArrayList<Integer>();
ArrayList<String> arrayResult = new ArrayList<String>();
int n = 9;
returnNQueen(array, arrayResult, n);
System.out.println("总的解的个数为:" + arrayResult.size());
Iterator<String> it = arrayResult.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
/**
* 深度优先搜索DFS可以采用递归的方式求解
* @param array为存储的是数字,表示每一行的皇后所在的列数
* @param arrayResult为一个解,主要把解转换成字符串
* @param n皇后的问题规模
*/
public static void returnNQueen(ArrayList<Integer> array,
ArrayList<String> arrayResult, int n) {
// 判断ArrayList是否已满
if (array.size() == n) {
arrayResult.add(array.toString());
}
// 没满的情况
for (int i = 0; i < n; i++) {
if (checkIsNQueen(array, i)) {
array.add(i);
returnNQueen(array, arrayResult, n);//递归求解
array.remove(array.size() - 1);
}
}
}
/**
* 对解进行检查,主要有两种:1、皇后出现在同一列上
* 2、皇后在两个对角线上
* @param array存放的以求出的皇后的位置
* @param k新的皇后的位置
* @return 如果将新的皇后插入,检查此时是否会有冲突
*/
public static boolean checkIsNQueen(ArrayList<Integer> array, int k) {
int n = array.size();// 得到数组的大小
for (int i = 0; i < n; i++) {
// 第一种情况
if (array.get(i) == k) {
return false;
}
// 第二种情况
if (n - i == Math.abs(k - array.get(i))) {
return false;
}
}
return true;
}
}
部分结果:
(当n=9时)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法