`
qly198
  • 浏览: 14415 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

思路最简单的8皇后问题

J# 
阅读更多
package queen;

import java.util.Date;

public class SimpleQueen {

private final int size ;//棋盘大小
private boolean[][] isOccupied ;//初始化为false
private static int hasQueen = 0;//已经存在的皇后数
private static int count = 0;//统计总数

public SimpleQueen(int size){
this.size = size;
isOccupied = new boolean[size][size];
}

/**
* 条件一,判断此列是否有摆放皇后
*/
private boolean isColOccupied(int line){
for(int i = 0; i < size; i++){
if(isOccupied[i][line] == true){
return false;
}
}
return true;
}

/**
* 条件二,判断对角线是否有摆放皇后
*/
private boolean isFourPointsOccupied(int row,int col){

int i ,j ;//四次for循环的时候一定需要将i j进行重新初始化,否则越界,容易调用的是上一次for循环后 i j的值

//判断右下角
for(i=row,j=col;i < size&&j < size; i++,j++){
if(isOccupied[i][j] == true){
return false;
}
}

//判断左上角
for(i=row,j=col;i >= 0&&j >= 0; i--,j--){
if(isOccupied[i][j] == true){
return false;
}
}

//判断右上角
for(i=row,j=col;i >= 0&&j < size; i--,j++){
if(isOccupied[i][j] == true){
return false;
}
}

//判断左下角
for(i=row,j=col;i < size&&j >= 0; i++,j--){
if(isOccupied[i][j] == true){
return false;
}
}

return true;
}

/**
* 开始从第i行安放皇后的位置
*/
private void place(int row){
if(row >= size) //从第row行安放皇后,如果row大于棋盘的行数,程序结束
return;

for(int i = 0; i < size; i++){
if(isColOccupied(i) && isFourPointsOccupied(row, i)){
isOccupied[row][i] = true;//条件一、二均满足,则该位置可以放置皇后
hasQueen++;//并且皇后数加一
if(hasQueen == size){
count++;//得到方案个数
printQueen();//调用打印函数
isOccupied[row][i] = false;//对数组该位置还原为false,以进行下一种情况查找
hasQueen--;
continue;//for循环中,该语句后面的不需要执行,进入下一次for循环
}
//进行到这一步说明:程序查找 row 行 i 列
this.place(row+1);
this.isOccupied[row][i] = false;
hasQueen--;
}
}

}

/**
* 打印满足条件的摆放方法
*/
private void printQueen(){
System.out.println("第 " + count + " 种摆放方案如下:");
for(int i = 0; i < size; i++){
for(int j = 0; j < size; j++){
if(isOccupied[i][j]==true)
System.out.print("+ ");
else
System.out.print("- ");
}
System.out.println();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long start = new Date().getTime();
new SimpleQueen(5).place(0);
System.out.println("\n一共有 " + count + " 种摆放方案");
long end = new Date().getTime();
System.out.println("一共耗时 "+(end-start)+" ms");
}

}
分享到:
评论

相关推荐

    八皇后问题详细的解法-23页 PPT PDF版.pdf

    **盲目的枚举算法**是一种最直观但效率较低的方法来解决八皇后问题。这种算法的核心思想是通过多层循环来尝试所有可能的皇后放置方案,并且在每一种方案中检查是否满足问题的约束条件(即任意两个皇后不能位于同一行...

    N皇后问题答案求解QT实现(带源码)

    八皇后问题(N=8)是最常见的版本,但通过修改源码中的N值和调整棋盘大小,可以扩展到更大的N皇后问题。 在QT新手的背景下,这个项目可能代码结构简单,注释清晰,适合学习者理解递归和回溯算法。通过这个项目,...

    基于 C++ 实现爬山法,模拟退火算法,遗传算法 求解N皇后问题

    总之,通过C++实现的爬山法、模拟退火算法和遗传算法,可以在N皇后问题的求解中展现出各自的优势,它们不仅有助于理解这些优化算法的工作原理,也为我们解决其他复杂问题提供了宝贵的思路和实践。在实际应用中,...

    Queen2-master_Queenmaster_N皇后问题_

    在本项目“Queen2-master_Queenmaster_N皇后问题”中,开发者采用了一种创新的解决方案——遗传算法,来解决4皇后、8皇后乃至16皇后的布局问题。 首先,我们来了解一下N皇后问题的基本概念。在这个问题中,每行只能...

    八皇后问题 递归版 更高效

    八皇后问题是一个经典的计算机科学问题,其目标是在一个8×8的国际象棋棋盘上放置八个皇后,使得没有任何两个皇后能够互相攻击。根据国际象棋的规则,皇后可以沿着水平、垂直以及对角线方向进行移动。因此,解决这个...

    八皇后问题的解决 源代码!!

    下面我将详细解释八皇后问题的解决思路和可能的代码实现方式。 首先,我们可以用二维数组来表示棋盘,其中0表示该位置没有皇后,1表示有皇后。我们需要遍历所有可能的放置方式,每次尝试在当前行放置一个皇后,并...

    n皇后算法的实现方法

    动态规划通常用于问题具有重叠子问题和最优子结构的特性,而n皇后问题的解不具有这样的特性,因此回溯法更为适用。 总之,n皇后问题是一个典型的约束满足问题,通过C++实现时,我们可以利用回溯法有效地搜索所有...

    用C++编的N皇后问题代码

    ### N皇后问题与C++实现解析 #### 一、N皇后问题概述 ...通过对代码的逐行分析,我们可以更深入地理解N皇后问题的解决思路及其在计算机科学中的应用。此外,代码中的图形化显示结果也为理解解决方案提供了直观的帮助。

    Python解决八皇后问题示例

    八皇后问题是一个经典的算法问题,它要求在8×8的棋盘上放置八个皇后,使得它们互不攻击。即,任何两个皇后都不能处于同一行、同一列或同一对角线上。这个问题的解决方案数量为92种,对于n皇后问题,即在n×n的棋盘...

    ios使用OC写算法之递归实现八皇后

    知道国际象棋的朋友们应该知道里面的皇后是最厉害的角色,她可以上下左右通吃,和中国象棋里面的车(ju 一声)一样,但是她比车更强大,她可以在斜线上也做到通吃,而我们的八皇后问题其实简单来说就是如何能够在 8...

    算法设计--八枚硬币问题.rar

    在八皇后问题中,目标是在一个8×8的棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。而八枚硬币问题与此类似,不过它不是放置皇后,而是放置硬币,同样要求任何两枚硬币不能在同一行、...

    PTA 天梯赛习题思路和题解

    8. **动态规划优化**:在面对具有重叠子问题和最优子结构的问题时,动态规划是一种常用的解决方法。通过记忆化搜索或自底向上的方式,可以避免重复计算,提高效率。 9. **编码技巧**:良好的编码习惯和技巧也非常...

    ACM简单题计算题

    递归和回溯方法常用于解决树形结构问题和组合优化问题,如八皇后问题、N皇后问题、迷宫求解等。理解递归的思想,学会何时使用回溯避免无效分支,能有效提升解题效率。 6. **贪心策略** 贪心算法通常用于处理局部...

    信息学竞赛简单回溯法讲解

    总的来说,简单回溯法在信息学竞赛中扮演着重要角色,它通过试错和回溯来寻找问题的解,适用于解决组合优化问题,如N皇后问题、背包问题等。掌握好回溯法,对于提升信息学竞赛的解题能力至关重要。在实际应用中,还...

    数据结构经典问题和算法分析

    这种方法常用于解决约束满足问题,如八皇后问题或图的染色问题。 六、贪婪法 贪婪法在求解问题时,每一步都选择当前看起来最优的选择,而不考虑全局最优解。它适用于那些局部最优解能够导致全局最优解的问题,如找...

    ACM简单题(二)

    甚至可能出现回溯法或深度优先搜索用于解决组合问题,如八皇后问题或数独填充。 此外,对于ACM竞赛而言,时间复杂度和空间复杂度的优化至关重要。在解决这些题目时,参赛者需要考虑如何在限制时间内运行代码,并尽...

    tyut算法设计与分析实验报告

    每种方法在解决问题的过程中都有其独特的思路和策略,能够帮助学生在计算机科学的学习过程中,培养出扎实的算法理论基础和解决实际问题的能力。通过具体的编程实践,学生不仅学会了算法的实现步骤,还能够通过分析...

    常用算法分析设计(分治、动态规划、分支限界、回溯、贪婪等等)

    分治法是一种将大问题分解为小问题来解决的思路,它将复杂的问题划分为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。典型的分治算法有快速排序、归并排序和...

Global site tag (gtag.js) - Google Analytics