`

八皇后回溯解法

阅读更多

经典问题,教科书式解题过程,可是在判断布局的合法性上徘徊了很久,逻辑一如既往的混乱,希望这只是由于太累的缘故,其实也只是为了练练手,感觉回溯那部分的代码十分好写,主要还是逻辑上的问题比较费劲。

 

 

public class EightQueen {
	private int[][] chess;
	private int[] used;//列数已用标记,在构造函数中初始化为-1
	private int length;

	public static void main(String[] args) {
		EightQueen eq = new EightQueen(4);
		eq.trial(0);

	}

	public EightQueen(int n) {
		this.chess = new int[n][n];
		this.used = new int[n];
		for (int i = 0; i < n; i++)
			used[i] = -1;
		this.length = n;
	}

	public void trial(int i) {
		//输出当前布局
		if (i == length) {
			System.out.println("——————————————");
			for (int r = 0; r < length; r++) {
				System.out.print("|");
				for (int c = 0; c < length; c++) {
					if(chess[r][c]==1)
						System.out.print(" X ");
					else
						System.out.print(" O ");
				}
				System.out.println("|");
			}
			System.out.println("——————————————");
		} else

			for (int j = 0; j < length; j++) {
				chess[i][j] = 1;//在第i行第j列放置皇后
				if (condition(i, j)) {//布局合法则把此列标记为此行的行数
					used[j] = i;
					trial(i + 1);//向下递归
				}
				//回溯
				if (used[j] == i)
					used[j] = -1;//当回溯到i行时,撤销对此行的列标记
				chess[i][j] = 0;//移走皇后

			}
	}

	public boolean condition(int i, int j) {
		boolean var = true;

		if (i > 0) {
			if (used[j] != -1) {
				var = false;//一列只能有一个皇后
			}

			else {
				if (j != 0 && j != length - 1) {
					if (chess[i - 1][j - 1] == 1 || chess[i - 1][j + 1] == 1)
						var = false;//非边界的皇后的左上对角或右上对角不能有皇后
				}
				//边界上的皇后合法性判定
				if (j == 0) {
					if (chess[i - 1][j + 1] == 1)
						var = false;
				}
				if (j == length - 1) {
					if (chess[i - 1][j - 1] == 1)
						var = false;
				}
			}
		}
		return var;
	}
	
}
分享到:
评论

相关推荐

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

    ### 八皇后问题详解 ...通过以上分析可以看出,八皇后问题的不同解法各有特点,从简单的枚举算法到高效的回溯法,每种方法都有其适用场景。在实际解决问题时,应根据问题的具体需求选择合适的算法。

    八皇后递归解法

    八皇后问题是一种回溯思想的体现,可以用C语言里面的递归算法实现

    八皇后问题解法(c和c++)

    八皇后问题的两种解法,包含c方式和c++方式

    八皇后 的三种解法 (java编写)

    首先,我们来了解一下八皇后问题的基本解法。一般来说,解决八皇后问题的方法主要有以下三种: 1. **深度优先搜索(DFS)**:这是最常见的解决方法,利用递归的方式,每次尝试在当前行放置一个皇后,并检查是否与前...

    八皇后问题回溯求解 matlab

    用回溯求解法求解八皇后问题,经典问题matlab实现,欢迎大家下载

    C#八皇后解法

    八皇后问题是一个经典的回溯算法问题,它源于19世纪由数学家鲁道夫·路德维希·卡尔·莫里斯·莱昂哈德·欧拉提出,旨在在8×8的棋盘上放置8个皇后,使得任意两个皇后都无法在同一行、同一列或同一斜线上互相攻击。...

    八皇后问题的c解法 c源代码 回溯法

    八皇后问题 c源代码 回溯法 通过更改N的值可以演变成为N皇后 不过当N大于一定的数值时 电脑会花费比较长的时间哦

    回溯法解决八皇后问题

    文章中提到了使用C语言实现八皇后问题的解法。具体的实现通常涉及递归函数的编写,以及使用数组来记录每个皇后的位置。递归函数会不断尝试放置皇后,并在发现冲突时回溯。 ##### (二)性能考量 1. **时间复杂度**...

    八皇后问题C解法

    通过上述分析,我们可以看出,八皇后问题的C语言解法主要依赖于递归和回溯策略,以及合理的数据结构设计来高效解决问题。这种方法不仅解决了八皇后问题,还展示了如何通过算法优化来解决更广泛的排列组合问题。理解...

    八皇后问题c++解法

    本篇介绍的八皇后问题C++解法采用回溯算法实现。通过递归地尝试在每一行放置皇后,并利用回溯机制来撤销非法的决策,最终能够找出所有可能的解法。这种方式不仅简洁高效,而且易于理解和实现。对于学习回溯算法和...

    C#回溯法8皇后问题-实验报告+程序

    使用C#编写回溯法解决8皇后问题的实验报告和程序 有图形界面,可以查看任意一种解法

    八皇后问题C语言解法

    ### 八皇后问题C语言解法 #### 一、八皇后问题概述 八皇后问题是一个经典的问题,在棋盘上放置八个皇后,要求任何两个皇后不能处于同一行、同一列或同一对角线上。该问题可以扩展到任意大小的棋盘(N皇后问题),...

    八皇后问题MFC实现

    八皇后问题是计算机科学中一个经典的回溯算法应用实例,它要求在8×8的棋盘上摆放8个皇后,使得任何两个皇后都无法在同一行、同一列或同一对角线上互相攻击。这个问题最早由数学家路易斯·卡洛在19世纪提出,至今...

    八皇后问题

    八皇后问题,回溯算法,92种解法均有,且结果真观易懂

    八皇后问题C语言源代码

    这段代码展示了如何用C语言实现八皇后问题的解法。`isSafe`函数检查当前位置是否可以放置皇后,`solveNQueens`函数递归地尝试所有可能的布局。在主函数中,我们初始化一个空的棋盘并调用`solveNQueens`开始解决问题...

    八皇后控制台程序

    回溯算法是解决八皇后问题的关键。当尝试在棋盘上放置皇后时,如果发现当前位置冲突,就回溯到上一步,尝试其他可能性。这个过程会递归进行,直到找到所有可能的解或确定无解。在C++中,可以使用递归函数和栈来实现...

    demo.rar_DEMO_八皇后 _八皇后问题

    下面我们将深入探讨八皇后问题的解法以及如何通过代码实现。 首先,我们需要理解问题的本质。八皇后问题的关键在于寻找所有可能的放置方式,使得每个皇后都位于不同的行、列和对角线上。我们可以采用回溯法来解决,...

    vb 八皇后源码下载

    在VB(Visual Basic)环境下,解决八皇后问题可以帮助初学者理解递归、回溯等编程概念,以及如何在实践中应用这些概念。下面我们将深入探讨八皇后问题的背景、解决方案以及VB源码实现。 八皇后问题要求在8×8的棋盘...

Global site tag (gtag.js) - Google Analytics