`

经典n皇后问题java代码实现

    博客分类:
  • J2SE
 
阅读更多

问题描述:在n*n的二维表格,把n个皇后在表格上,要求同一行、同一列或同一斜线上不能有2个以上的皇后。

例如八皇后有92种解决方案,五皇后有10种解决方案。

public class TestQueen {

	int n; //皇后的个数
	int num = 0; // 记录方案数
	int[] queenCol; // 记录n个皇后所占用的列号
	boolean[] col; // 列安全标志
	boolean[] diagonal; // 对角线安全标志
	boolean[] undiagonal; // 反对角线安全标志

	public TestQueen(int n) {
		this.n = n;
		queenCol = new int[n];
		col = new boolean[n];
		diagonal = new boolean[2 * n - 1];
		undiagonal = new boolean[2 * n - 1];
		for (int i = 0; i < n; i++)
			// 置所有列为安全
			col[i] = true;
		for (int t = 0; t < (2 * n - 1); t++)
			// 置所有对角线为安全
			diagonal[t] = undiagonal[t] = true;
	}

	public void run() {
		solve(0);
		if (num == 0) {
			System.out.println(n + "皇后无解!");
		}
	}

	// 从i行开始,把之后的皇后放好
	private void solve(int i) {
		for (int j = 0; j < n; j++) {
			if (col[j] && diagonal[i - j + n - 1] && undiagonal[i + j]) {
				// 表示第i行第j列是安全的可以放皇后(i,j从0开始)
				queenCol[i] = j;
				col[j] = false; // 修改安全标志
				diagonal[i - j + n - 1] = false;
				undiagonal[i + j] = false;
				if (i < n - 1) // 判断是否放完n个皇后
				{
					solve(i + 1); // 未放完n个皇后则继续放后面的
				} else // 已经放完n个皇后
				{
					num++;
					System.out.println("皇后摆放第" + num + "种方案:");
					System.out.print("行分别为");
					for (int k = 0; k < n; k++)
						System.out.print(k + " ");
					System.out.print("\n");
					System.out.print("列分别为");
					for (int k = 0; k < n; k++)
						System.out.print(queenCol[k] + " ");
					System.out.print("\n");
				}
				col[j] = true; // 修改安全标志,回溯
				diagonal[i - j + n - 1] = true;
				undiagonal[i + j] = true;
			}
		}
	}

	public static void main(String[] args) {
		TestQueen q = new TestQueen(5);
		q.run();
	}
} 

输出结果:

皇后摆放第1种方案:
行分别为0 1 2 3 4
列分别为0 2 4 1 3
皇后摆放第2种方案:
行分别为0 1 2 3 4
列分别为0 3 1 4 2
皇后摆放第3种方案:
行分别为0 1 2 3 4
列分别为1 3 0 2 4
皇后摆放第4种方案:
行分别为0 1 2 3 4
列分别为1 4 2 0 3
皇后摆放第5种方案:
行分别为0 1 2 3 4
列分别为2 0 3 1 4
皇后摆放第6种方案:
行分别为0 1 2 3 4
列分别为2 4 1 3 0
皇后摆放第7种方案:
行分别为0 1 2 3 4
列分别为3 0 2 4 1
皇后摆放第8种方案:
行分别为0 1 2 3 4
列分别为3 1 4 2 0
皇后摆放第9种方案:
行分别为0 1 2 3 4
列分别为4 1 3 0 2
皇后摆放第10种方案:
行分别为0 1 2 3 4
列分别为4 2 0 3 1

分享到:
评论

相关推荐

    回溯法解决N皇后问题 Java代码实现

    在Java代码实现中,通常会使用二维数组表示棋盘,数组的索引代表行和列。对于PLACE函数,可以遍历已经放置的皇后,检查新皇后位置是否冲突。如果找到冲突,返回false;如果没有冲突,返回true。整个过程使用递归函数...

    NQueen N皇后问题java实现

    **N皇后问题**是计算机科学领域中一个经典的回溯算法问题,它的目标是在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都无法在同一行、同一列或同一条对角线上互相攻击。这个问题在Java编程中具有重要的学习价值,...

    Java编写的N皇后问题

    在"DataStructTest"这个文件中,很可能是包含了Java代码的测试类,用于验证N皇后问题的解决方案。测试类通常会包含一些单元测试,这些测试用例会设置不同大小的棋盘,调用N皇后问题的解决函数,并验证返回的结果是否...

    n皇后问题(java含界面)

    **n皇后问题**是计算机科学中的一个经典问题,它的目标是在一个n×n的棋盘上放置n个皇后,使得任何两个皇后都不会在同一行、同一列或同一对角线上。这个问题展示了回溯算法的应用,是一种典型的约束满足问题。在本...

    算法用JAVA写的n皇后问题

    **压缩包子文件的文件名称列表**:“n皇后问题”可能是包含Java源代码的文件,可能包含一个主程序类和一个或多个辅助类,用于实现n皇后的解决方案和图形用户界面(GUI)展示。 总的来说,解决n皇后问题不仅可以锻炼...

    java 实现N皇后问题源代码,不含界面代码

    ### Java实现N皇后问题 #### 一、问题背景与定义 N皇后问题是一个经典的问题,在一个N×N的棋盘上摆放N个皇后,要求所有皇后彼此之间不能互相攻击(即任意两个皇后不能处于同一行、同一列或相同的对角线上)。此...

    N皇后问题 java图形界面实现.doc

    《N皇后问题 Java图形界面实现》 N皇后问题是一个经典的回溯算法问题,它在计算机科学领域具有重要的教学价值。该问题要求在n×n的棋盘上放置n个皇后,使得任意两个皇后不能在同一行、同一列或对角线上。在Java环境...

    Java实现N皇后问题的算法

    这是一个用Java实现的关于N皇后问题的算法 其中包括回溯和迭代两种算法

    N皇后问题,带界面的 java版

    在名为"nhuanghou"的压缩包文件中,应该包含了上述类的源代码文件,通过阅读和分析这些代码,可以更深入地理解N皇后问题的Java实现和GUI设计。此外,源代码可能会包含一些注释,帮助理解代码的功能和工作原理。 总...

    回溯法实现N皇后问题

    N皇后问题是一个经典的计算机科学问题,它的目标是在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。这是一个典型的约束满足问题,可以利用回溯法来解决。 **一、回溯法简介...

    N皇后问题的Java程序实现及分析.pdf

    本文将深入探讨N皇后问题的Java程序实现,并对其程序运行时间进行分析。 首先,让我们回顾一下N皇后问题的起源。19世纪数学家高斯在1850年提出了这一问题,问题要求在N×N的棋盘上放置N个皇后,使得它们互不攻击,...

    N皇后(java代码).docx

    ### N皇后问题解析及Java实现 #### 一、N皇后问题概述 ...综上所述,N皇后问题是展示回溯算法的一个很好的例子,通过对给定Java代码的分析,我们不仅可以了解该问题的基本解决思路,还能进一步探索算法优化的可能性。

    n皇后问题的最简单解决方案

    该实现主要关注于如何用最少的代码量来解决n皇后问题,同时也表达了作者对于代码简洁性的追求。 #### 代码分析 根据提供的部分代码片段,我们可以尝试解读其中的关键部分: 1. **类型定义**:代码中定义了一个名...

    使用Java实现的N皇后问题

    算法作业,2011年4月份写的。希望帮助一些需要的人,代码就不给了,需要的使用反编译工具看吧

    n皇后问题(队列分支限界法)

    n皇后问题是一个经典的计算机科学问题,它在棋盘上放置n个皇后,要求任何两个皇后不能在同一行、同一列或同一斜线上。这个问题是回溯算法和分支限界法的良好应用实例,旨在展示如何在有限的搜索空间中找到所有可能的...

    n后问题回溯算法 java

    以下是一个简化的Java代码框架,展示了如何使用回溯算法来解决n皇后问题: ```java public class NQueens { private int[] board; private int count; // 记录解的数量 private int n; public NQueens(int n) ...

    java实现的n皇后问题

    **Java实现的N皇后问题详解** N皇后问题是一个经典的计算机科学问题,它的目标是在一个n×n的棋盘上放置n个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。这个问题展示了回溯算法的应用,是解决...

    八皇后问题遗传算法java实现

    遗传算法实现N皇后-java代码

    用回溯法实现n皇后问题(java源码)

    以下是用Java实现n皇后问题的核心代码片段: ```java public class NQueens { public List&lt;List&lt;String&gt;&gt; solveNQueens(int n) { // 初始化结果列表 List&lt;List&lt;String&gt;&gt; res = new ArrayList(); // 使用字符...

    java实现一些基本的算法,如快速排序,BFS,N皇后,最小生成树等

    本主题涵盖了几个经典的算法,包括快速排序、广度优先搜索(BFS)、N皇后问题以及最小生成树。下面我们将逐一详细探讨这些算法。 1. **快速排序**:快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它...

Global site tag (gtag.js) - Google Analytics