`
李亦鸿
  • 浏览: 11961 次
  • 性别: Icon_minigender_1
  • 来自: 海南
社区版块
存档分类
最新评论
  • baiyj71: quiz的例子因为浏览器版本的问题会出现报错,需要在smoke ...
    smoke.js

回溯法求N皇后问题

阅读更多

 回溯法:是一种选优搜索法, 回溯法从开始节点(根节点)出发,以深度优先方式搜索整个解空间。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

N皇后问题描述:在n乘n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之在同行或同列或同一斜线上的棋子。n后问题等价于在n 乘 n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。

求解思路有序地从第 1 行的第 1 列开始,尝试放上一个皇后,然后再尝试第 2 行的第几列能够放上一个皇后,如果第 2 行也放置成功,那么就继续放置第 3 行,如果此时第 3 行没有一行可以放置一个皇后,说明目前为止的尝试是无效的(即不可能得到最终解),那么此时就应该回溯到上一步(即第 2 步),将上一步(第 2 步)所放置的皇后的位置再重新取走放在另一个符合要求的地方…如此尝试性地遍历加上回溯,最后得到和规则的解。

package 算法实验;
/**
 * n皇后类
 *  回溯法求n皇后
 *
 */
public class NQueens {
	private static int queensNum ;//皇后的个数
	//定义一个数组,x[k]表示第k行的列数,x[k]=j表示第k行的第j位置放一位皇后
	private static int []x;
	/**
	 * 产生n位皇后的方法
	 */
	public void produceNQueens(){
		x[1]=0;//每一行从0开始
		int k=1;//从第1行开始
		while(k>0){
			x[k]=x[k]+1;
			while((x[k]<=queensNum)&&!(place(k)))//判断约束条件
				x[k]=x[k]+1;
			if(x[k]<=queensNum)
				if(k==queensNum)
				{
					//输出各行皇后的位置
					for(int i=1;i<=queensNum;i++)
					System.out.print("("+i+","+x[i]+") ");
					System.out.println();
				}
				else {
					k++;
					x[k]=0;
				}
			else k--;//回溯
		}
			
	}
	/**
	 * 判断放置皇后的约束条件的方法
	 * @param k
	 * @return
	 */
	public boolean place(int k){
		for(int j=1;j<k;j++)
			//任何2个皇后不能放在同一行或同一列或同一斜线上。
			if((Math.abs(j-k))==(Math.abs(x[j]-x[k]))||(x[j]==x[k]))return false;
		return true;
		
	}
	/**
	 * 程序入口:主函数
	 * @param args
	 */
	public static void main(String[] args){
		 queensNum=4;//给皇后个数初始值
		x = new int[queensNum+1];//给数组x赋长度
		//实例化对象
		NQueens nq = new NQueens();
		System.out.println(+queensNum+"位皇后的位置是:");
		//调用产生n位皇后的方法
		nq.produceNQueens();
	}

}

 

当N=4时,运行结果是:

 4位皇后的位置是:
(1,2) (2,4) (3,1) (4,3)
(1,3) (2,1) (3,4) (4,2)

 

 当N=6时,运行结果是:

 6位皇后的位置是:
(1,2) (2,4) (3,6) (4,1) (5,3) (6,5)
(1,3) (2,6) (3,2) (4,5) (5,1) (6,4)
(1,4) (2,1) (3,5) (4,2) (5,6) (6,3)
(1,5) (2,3) (3,1) (4,6) (5,4) (6,2)

 

 

 

分享到:
评论

相关推荐

    回溯法求n皇后问题的源程序

    用回溯法求N后问题,已经运行过,可以正常使用

    利用回溯法解决n皇后问题

    **下面我们将详细探讨如何利用回溯法解决n皇后问题:** 1. **初始化**:首先,我们需要创建一个二维数组表示棋盘,用0表示空位,用1表示已经放置了皇后的位置。 2. **放置皇后**:从棋盘的第一行开始,尝试在每一...

    回溯法解决N皇后问题

    使用回溯法解决n皇后问题,没有用到栈的结构(但实际算法类似于栈),代码比较简约漂亮

    回溯法实现N皇后问题

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

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

    回溯法解决N皇后问题是一种基于深度优先搜索的策略,用于找到所有可能的解决方案,而不仅仅是第一个找到的解。在N皇后问题中,目标是在一个n×n的棋盘上放置n个皇后,使得任意两个皇后都不会在同一行、同一列或同一...

    回溯法解决n皇后问题纯c++编写

    在本案例中,"回溯法解决n皇后问题"是核心知识点,n皇后问题是经典的计算机科学问题,其目标是在n×n的棋盘上放置n个皇后,使得任何两个皇后都无法在同一行、同一列或同一对角线上攻击彼此。 首先,我们需要理解n...

    n 皇后问题n 皇后 回溯法n 皇后 回溯法

    根据给定的信息,本文将详细解释“N皇后问题”及其回溯法求解方案。 ### N皇后问题概述 N皇后问题是指在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不会互相攻击(即任何两个皇后不能位于同一行、同一列或...

    n皇后问题实验报告

    ### N皇后问题实验报告知识点解析 ...通过本实验,学生不仅能够深入了解N皇后问题的算法原理,还能够掌握如何利用递归和回溯技术来解决问题。此外,通过实际编程操作,还能进一步提高学生的逻辑思维能力和编程技巧。

    利用回溯法求解n皇后问题

    回溯法求解n皇后问题,n皇后问题是一个非常有意思的游戏

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

    算法分析与设计 用回溯法实现n皇后问题(java源码)

    n皇后问题回溯法

    ### n皇后问题回溯法解析 #### 一、问题背景及定义 n皇后问题是一个经典的计算机科学问题。问题描述为:在n×n的棋盘上放置n个皇后,要求这些皇后不能处于同一行、同一列或同一斜线上。本问题通过C++编程语言采用...

    C#控制台回溯法实现n皇后问题

    总结起来,"C#控制台回溯法实现n皇后问题"是一个利用C#编程语言在控制台环境下,通过回溯算法解决经典计算机科学问题的实例。它涉及到的主要知识点包括:回溯法的概念和实现,递归算法,二维数组的使用,以及控制台...

    回溯法n后问题实验报告

    ### 回溯法n后问题实验报告知识点解析 #### 实验背景与目的 - **实验背景**:本实验属于华南师范大学计算机软件学院本科生课程“算法分析与设计”中的一项实践内容,旨在通过实际操作加深学生对回溯法的理解与应用...

    算法设计与分析 回溯法 n皇后问题

    总之,n皇后问题是回溯法的经典应用,它展示了如何通过系统地尝试所有可能的解决方案来解决一个复杂的约束满足问题。通过对n皇后问题的求解,我们可以学习到如何设计和实现回溯算法,以及如何用编程语言(如C++)来...

    回溯法解决n皇后问题

    本程序为广大学生同志服务,,,,,,,,,,,,,,,,,,,,,,,,vc环境下直接运行即可

    c++ 用回溯法解决经典的N皇后问题

    这个压缩包中的"回溯法_N皇后问题"文件可能包含了完整的C++代码实现,通过分析和运行这个代码,你可以更深入地理解如何利用回溯法解决N皇后问题。这种方法不仅锻炼了我们的编程能力,也让我们对回溯法有了更直观的...

    回溯法---n皇后问题,c语言编程

    回溯法---n皇后问题,c语言...回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程

    回溯法-N皇后问题_N皇后回溯法C++_

    总的来说,N皇后问题的回溯法C++实现是一个很好的学习案例,它不仅展示了如何运用回溯法解决复杂问题,还涉及到递归、约束检查和优化策略等多个编程和算法知识点。通过理解和实现这样的程序,可以加深对回溯法的理解...

    python回溯法解决n皇后问题

    python回溯法解决n皇后问题 n=8 #定义n皇后问题中的n maxN=n+5 a=[0 for i in range(1,maxN+1,1)] c=[False for i in range(1,maxN+1,1)] d=[False for i in range(1,2*maxN+1,1)] e=[False for i in range(1,2*maxN...

Global site tag (gtag.js) - Google Analytics