- 浏览: 466367 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
本文用递归的方法来实现八皇后问题,并设置了期望的皇后数,可以设置不同的皇后期望值,来输出更多的其它组合。
JAVA程序代码:
本文用递归的方法来实现八皇后问题,并设置了期望的皇后数,可以设置不同的皇后期望值,来输出更多的其它组合。
JAVA程序代码:
/** * 八皇后问题 * 八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。 * 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后, * 使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 * 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解, * 后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。 * * 本程序就是打印出皇后的各种解法。 * 本文设置了EXPECT_QUEEN_NUMBER,这个用来控制期望的个皇后个数,默认是8个。 * * @author Eric * */ public class QueenProblem { private static final String SEPARATOR_BLANK = " "; /* * 期望的皇后数目,默认为8皇后 * 如果想找9皇后的矩阵,那么只要EXPECT_QUEEN_NUMBER=9 即可。 */ private static final int EXPECT_QUEEN_NUMBER = 9; private int count = 0;// 统计8皇后解的个数 private void processQueenProblem(int currentQueenCount, int[][] currentMatrix) { int[][] tempMatrix = copyArray(currentMatrix);//复制矩阵,将作为递归的输入 /* * 当8 * 8的矩阵中有8个皇后,就输出矩阵的排列 */ if (currentQueenCount == EXPECT_QUEEN_NUMBER) { print(++count, tempMatrix);/*输出当前符合8皇后的矩阵*/ } else { /* * 如果还没有达到8个,就在currentMatrix[currentQueenCount][]中寻找符合条件的Queen * 递归调用 */ for (int col = 0; col < EXPECT_QUEEN_NUMBER; col++) { //在当前行中,从左到右寻找符合八皇后条件的位置 if (isQueenAvailable(currentQueenCount, col, tempMatrix)) { processQueenProblem(currentQueenCount + 1, selectOneQueen(currentQueenCount,col,tempMatrix)); } } } } /** * 设置该位置为皇后。 * * 将当前行所有的元素先设置为0,然后将当前行,列的元素设置成1. * * @param currentRow * @param currentCol * @param queenMatrix * @return */ private int[][] selectOneQueen(int currentRow,int currentCol ,int[][] queenMatrix){ for (int col = 0; col < EXPECT_QUEEN_NUMBER; col++) { queenMatrix[currentRow][col] = 0; } queenMatrix[currentRow][currentCol] = 1; return queenMatrix; } /** * 用于复制数组的元素 * @param sourceData * @return */ private int[][] copyArray(int[][] sourceData) { int[][] copyData = new int[EXPECT_QUEEN_NUMBER][EXPECT_QUEEN_NUMBER]; for (int i = 0; i < EXPECT_QUEEN_NUMBER; i++) { for (int j = 0; j < EXPECT_QUEEN_NUMBER; j++) { copyData[i][j] = sourceData[i][j]; } } return copyData; } /** * 符合8皇后的矩阵的输出 * @param count * @param result */ private void print(int count, int[][] result) { System.out.println("第" + count + "种解法"); for (int i = 0; i < EXPECT_QUEEN_NUMBER; i++) { for (int j = 0; j < EXPECT_QUEEN_NUMBER; j++) { System.out.print(result[i][j]+SEPARATOR_BLANK); } System.out.println(); } } /** * isQueenAvailable方法用来判断当前位置能否摆放皇后。 * * 因为递归调用中是根据row的增长而实现的, * 那么在当前的皇后矩阵中,当前行以后的元素暂时还不需要考虑,此时它们的值还都是默认值0。 * 所以当前行,列是否符合皇后的位置,它需要与当前行之前的元素进行比较。 * 因此,判断第row行第col列能不能摆皇后,只需要判断正上方,左上方和右上方三个方向即可。 * 只要有一个方向不符合要求,就表明当前这个位置不能摆放皇后。 * * @param currentRow * @param currentCol * @param queenMatrix * @return */ private boolean isQueenAvailable(int currentRow, int currentCol, int[][] queenMatrix) { //判断正上方(列方向) for (int row = 0; row < currentRow; row++) if (queenMatrix[row][currentCol] == 1) { return false; } //判断左上方 for (int row = currentRow, col = currentCol; row >= 0 && col >= 0; row--, col--) if (queenMatrix[row][col] == 1) { return false; } //判断右上方 for (int row =currentRow, col = currentCol; row >= 0 && col < EXPECT_QUEEN_NUMBER; row--, col++) if (queenMatrix[row][col] == 1) { return false; } //return true 表明该位置可以摆放皇后。 return true; } public static void main(String[] args) { QueenProblem queen = new QueenProblem(); queen.processQueenProblem(0, new int[EXPECT_QUEEN_NUMBER][EXPECT_QUEEN_NUMBER]); System.out.println("一共有" + queen.getCount() + "种解法"); } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 903面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6730本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2214本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1742尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2724本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2169正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3751本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1954问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3977题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3178题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8751EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3329题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6701面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9847Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1418个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2145从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7398for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4145本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2903本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
八皇后问题是一个经典的计算机编程问题,它涉及到回溯算法、数据结构和图形用户界面的设计。在C++中,特别是结合MFC(Microsoft Foundation Classes)框架,可以创建具有用户友好界面的程序来解决此问题。 首先,...
### 八皇后问题详解 #### 一、八皇后问题背景 八皇后问题是一个经典的计算机科学问题,也是数学领域中一个有趣的挑战。这个问题来源于国际象棋的背景:如何在一个8×8的国际象棋棋盘上放置八个皇后,使得没有任何...
它们被应用于解决各种复杂问题,包括经典的八皇后问题。八皇后问题是一个著名的棋盘放置问题,要求在8×8的棋盘上摆放8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。下面将详细解释这些方法以及...
八皇后问题 c++ 八皇后问题 c++ 八皇后问题 c++
用回溯求解法求解八皇后问题,经典问题matlab实现,欢迎大家下载
数据结构八皇后问题实验报告是一份详尽的项目文档,主要涵盖了八皇后问题的解决方案,该问题是一个经典的计算机科学和算法问题,源自国际象棋。报告的作者花费了两周时间完成,显然投入了大量的精力和思考。 八皇后...
八皇后问题课程设计论文
解决八皇后问题的源码,带有注释,由于数据结构即算法的学习,如有其他需要,请留言
作业代码,汇编写八皇后问题,自己写了一份,在网上找的也在里面
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...
linux c语言实现八皇后问题。希望对你的学习
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一...
八皇后问题是一个经典的问题,在棋盘上放置八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题最早由数学家欧拉提出,后来被广泛用来作为回溯法的典型示例。在这个Java程序...
八皇后问题是计算机科学中一个经典的回溯算法应用实例,它要求在8×8的棋盘上摆放8个皇后,使得任何两个皇后都无法在同一行、同一列或同一对角线上互相攻击。这个问题最早由数学家路易斯·卡洛在19世纪提出,至今...
### Python 实现八皇后问题详解 #### 一、八皇后问题背景及定义 八皇后问题是一个经典的计算机科学问题,最早由国际象棋爱好者马克斯·贝瑟尔在1848年提出。该问题是在一个8×8的国际象棋棋盘上放置8个皇后,使得...
这个文档关于八皇后问题,一共两种代码,输出分别为0和1的矩阵或者直接输出位置序号两种输出结果。代码是C++语言编写。
八皇后问题源代码解析 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。它的目标是在n×n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。解决这个问题...
八皇后问题 递归算法 可以输入皇后的值 输出排列的结果
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...
经典的算法,八皇后问题,c++实现,回溯法