`
杨杨和花花
  • 浏览: 22446 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

n皇后问题

阅读更多

      之前听过一个学长讲了n皇后问题,于是深有体会,想借机和大家分享一下用回溯法解决此问题的过程。

一.问题的描述:

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

输入:
    给定棋盘的大小n (n ≤ 13)
输出:
    输出有多少种放置方法。

 二.问题的解决:

     通过回溯法来解决,需要一个约束函数和一个限界函数选出满足条件,这两个函数统称为剪枝函数。

     约束函数是排除那些同行,同列,同一斜线的情况。

    

写道
/**
* 约束函数
* 判断条件 只要任何两个皇后不在同一斜线,同行或者同列
* @return
*/
public boolean Place(int k){
for(int i=1;i<k;i++)
if(Math.abs(k-i)==Math.abs(a[k]-a[i])||(a[k]==a[i]))
return false;
return true;
}

    我这里其实限界条件和回溯函数写在了一起。当t>n,我们就已经找到了一种方案。 

   

//回溯函数
	public void Backtrack(int t){
		if(t>n)
			sum++;
		else
		for(int i=1;i<=n;i++){
			a[t]=i;
			if(Place(t))
			   Backtrack(t+1);
		}	
	}

   我定义了一个n皇后类,里面包含约束函数,回溯函数,打印函数,以下是程序的完整代码

  

package queenSort;

/**
 * 这是n皇后算法类
 * @author Administrator
 *
 */
public class QueenCode {
    private int a[];
    private int n=0;
	private long sum=0;
	/**
	 * 
	 * @param n
	 * @param a   a[i]表示的意思为皇后放在第i行第a[i]列
	 */
	public QueenCode(int n,int a[]){
		this.n=n;
		this.a=a;
	}
	
	/**
	 * 约束函数
	 * 判断条件     只要任何两个皇后不在同一斜线,同行或者同列
	 * @return
	 */
	public boolean Place(int k){
		for(int i=1;i<k;i++)
			 if(Math.abs(k-i)==Math.abs(a[k]-a[i])||(a[k]==a[i]))
				 return false;
		return true;
	}
	
	/**
	 * 
	 * @param t  表示第i行
	 */
	//回溯函数
	public void Backtrack(int t){
		if(t>n)
			sum++;
		else
		for(int i=1;i<=n;i++){
			a[t]=i;
			if(Place(t))
			   Backtrack(t+1);
		}	
	}
	
	public void PrintSort(){
		System.out.println("当前的皇后摆法有"+sum+"种");
	}
}



*********************************************************

package queenSort;

public class QueenMain {
	public static void main(String args[]){
		int n=8;
		int a[]=new int[n+1];
		for(int i=0;i<n;i++){
			a[i]=0;
		}
		QueenCode code=new QueenCode(n,a);
		code.Backtrack(1);
		code.PrintSort();
	}

}

    以上的方法确实很简单就算出方案个数,但是就具体的摆法代码本身并没有给出。如果希望实现,需要   

加入二维数组来记录摆放的棋子。

    细心的读者和许多朋友都知道,就是如果n>=14的话,我们的eclipse是会报栈溢出的,这就关系到java的

    栈大小是固定的。一旦超过里面层数,就不再给函数分配空间了。

  

分享到:
评论

相关推荐

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

    在本例中,我们关注的是一个经典的计算机科学问题——n皇后问题。n皇后问题是一个在n×n棋盘上放置n个皇后,使得皇后之间不能互相攻击的问题。这里的“攻击”指的是皇后可以沿着行、列或对角线攻击到其他皇后。 n...

    n皇后问题实验报告

    ### N皇后问题实验报告知识点解析 #### 一、实验目的及要求 本次实验的主要目的是让学生通过实际编程操作,深入理解并解决N皇后问题。实验要求包括以下几点: 1. **了解皇后相互攻击的条件**:当两个皇后位于同一...

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

    在这个场景中,我们关注的是“n皇后问题”。n皇后问题是在一个n×n的棋盘上放置n个皇后,要求任何两个皇后不能处于同一行、同一列或同一对角线上。** **C++是实现这一算法的理想选择,它是一种静态类型的、编译式的...

    用栈求解n皇后问题 ,经典的回溯算法问题

    n 皇后问题是一道经典的回溯算法问题,其目标是在一个 � × � n×n 的棋盘上放置 � n 个皇后,使得任意两个皇后都不能在同一行、同一列或同一斜线上。 栈可以用来辅助实现回溯算法,本质上就是手动维护了递归...

    n皇后问题C++源码

    n皇后问题C++源码。{典型的8皇后问题的扩展)

    N皇后问题摆法算法描述

    N皇后问题是一个经典的计算机科学问题,它源自国际象棋,目标是在一个N×N的棋盘上摆放N个皇后,使得任何两个皇后都无法通过同一行、同一列或同一对角线互相攻击。这个问题展示了如何利用回溯算法或者深度优先搜索...

    用栈的n皇后问题源码+流程图

    **n皇后问题**是计算机科学中的一个经典问题,它的目标是在一个n×n的棋盘上放置n个皇后,使得任何两个皇后都不会在同一行、同一列或同一对角线上相互攻击。这个问题通常用来演示回溯算法和深度优先搜索(DFS)在...

    C语言解决n皇后问题 例如八皇后问题 列出所有解的情况

    **C语言解决n皇后问题详解** n皇后问题是一个经典的回溯法问题,它涉及到在n×n的棋盘上放置n个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。以八皇后问题为例,即在8×8的棋盘上放置8个皇后,找...

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

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

    CSP最小冲突法解决n皇后问题

    **CSP最小冲突法解决n皇后问题** 在计算机科学领域,**CSP(Constraint Satisfaction Problem,约束满足问题)**是一种常见的问题求解框架,用于处理一系列条件或限制下的变量分配问题。n皇后问题是一个经典的CSP...

    回溯算法n皇后问题

    回溯算法是一种基于深度优先搜索的算法,常用于解决复杂问题的求解,例如N皇后问题。N皇后问题是在一个N×N的棋盘上放置N个皇后,要求任何两个皇后不能处于同一行、同一列或同一斜线上,找出所有可行的解决方案。此...

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

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

    N皇后问题C++代码

    N皇后问题C++代码 N皇后问题是计算机科学中的一种经典问题,旨在在N*N的棋盘上摆放N个皇后,使得每个皇后不在同一行、同一列或同一对角线上。下面是使用C++语言实现的N皇后问题的解决方案。 类的设计 在解决N皇后...

    n皇后问题回溯法

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

    N皇后问题代码

    n皇后问题代码 回溯法 递归回溯 算法设计与分析

    n皇后问题c++实现

    n皇后问题C++实现 n皇后问题是计算机科学中的一种经典问题,旨在寻找一种算法,可以将n个皇后摆放在n*n的棋盘上,使得每个皇后不在同一行、同一列或同一斜线上。该问题的解决需要使用回溯法,首先初始化一个一维...

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

    这些算法在解决复杂问题时展现出强大的能力,特别是对于NP完全问题,如N皇后问题。N皇后问题是一个经典的问题,目标是在一个n×n的棋盘上放置n个皇后,使得任意两个皇后之间都不能互相攻击,即不存在同行、同列或对...

    黑板风格,管道风格,调用返回风格,回溯法等解决N皇后问题

    在编程领域,解决复杂问题的方法多种多样,其中“N皇后问题”是一个经典的示例,它展示了不同的编程策略和设计模式。本篇文章将深入探讨“黑板风格”、“管道风格”、“调用返回风格”以及“回溯法”这四种方法在...

    NQueen N皇后问题java实现

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

Global site tag (gtag.js) - Google Analytics