`
java-mans
  • 浏览: 11710548 次
文章分类
社区版块
存档分类
最新评论

八皇后问题 [No. 59]

 
阅读更多

问题:

8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。请求出总共有多少种摆法。下图为一种为符合条件的摆放。


思路:

因为棋盘的长宽和皇后的个数是一样的,那么,每一个皇后总是占据其中的一列(或者一行,我们这里假设皇后占据的是列,所以,第i个皇后总是在第i列上)。但是每一个皇后在行上面有很多种不同的位置,如果我们用一个数组row[i]来表示第i个皇后所处的行的位置,那么第i个皇后的坐标为(row[i], i)。这里,我们认为皇后的编号从0开始。

因为条件要求“任意两个皇后不得处在同一行、同一列或者同一对角斜线上”。假如,我们放皇后是从0开始,然后放1,,,,一直到7。那么,我们放第i个皇后的时候,前面i-1个皇后其实已经放好了,而且都满足条件,那么放第i个皇后的时候,我们只需要看第i个皇后的位置是否和前面的i-1个皇后满足相应的条件,因为皇后都放在不同的列上,所以,我们只需要考虑是否在同一行或者在同一斜线上。代码如下:

//compare the n-th queen's row position with the previous (n-1) queen's row position,n refers to the n-th queen
	public boolean isSatisfied(int n, int[] row){
		for(int i = 0; i < n; i++){
			//on the same row
			if(row[i] == row[n]) return false;
			//on the same oblique line(斜线)
			if(Math.abs(row[n] - row[i]) == n - i) return false; 
		}
		return true;
	}
有了这样一个判断的方法,我们只需要把第i个皇后放在第从0到7的任意一行(for loop),然后,把第i个皇后与前面i-1个皇后的位置进行比较,如果满足,再放第i+1个皇后,直到,所有的皇后都在棋盘上了。 代码中count指的是皇后的个数。

代码核心部分:

  // the main method to find all the possible cases. n refers to the n-th queens.
	public void queen(int n, int[] row){
		if (n == count) {
			times++;
			print(row);//print
			return;
		}
		
		//put the nth queen to all the possible position
		for(int i = 0; i < count; i++){
			row[n] = i;	//put the nth queen to the row i. 
			if(isSatisfied(n, row)) {
				queen(n+1, row);
			}
		}
   }
	//print the successful case
	public void print(int[] row){
		System.out.println("the "+times+"th successful case");
		for(int i = 0; i < count; i++){
			System.out.println("the "+i+"th column, the "+row[i]+"th row");
		}
	}

代码其它部分:

public class BackDateQueen{
	
	//r[i] refers to the ith queen's row position。
	// count refers to the number of queens
	private int count = 0;
	// times refers to how many possible cases
	private int times;
	
	//constructor
	public BackDateQueen(int count){
		times = 0;
		this.count = count;
	}
	
	public static void main(String[] args){
		BackDateQueen bdq=new BackDateQueen(4);
		int[] row = new int[4];
		
		//no queen on the board
		for (int i = 0; i < 4; i++) {
			row[i] = -1;
		}
		bdq.queen(0, row);
	}
}
参考:http://blog.csdn.net/lixiaoshan_18899/article/details/1286716

http://zhedahht.blog.163.com/blog/static/2541117420114331616329/

转载请注明出处:blog.csdn.net/beiyeqingteng

分享到:
评论

相关推荐

    用c语言解决八皇后问题

    ### 使用C语言解决八皇后问题 #### 背景与目标 八皇后问题是经典的回溯算法应用案例之一,其目标是在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不在同一行、同一列或同一斜线上。本篇文章通过一段C语言代码...

    八皇后问题 输出8皇后问题所有结果。

    每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的...

    vb 八皇后源码下载

    八皇后问题是一个经典的计算机编程问题,源于19世纪由国际象棋大师马克斯·贝瑟尔提出。在VB(Visual Basic)环境下,解决八皇后问题可以帮助初学者理解递归、回溯等编程概念,以及如何在实践中应用这些概念。下面...

    八皇后编程--matlab\c

    ### 八皇后问题详解及其MATLAB与C语言实现 #### 一、八皇后问题概述 八皇后问题是一个经典的计算机科学问题,它最早由国际象棋爱好者马克斯·贝瑟尔在1848年提出,并在1850年由弗朗西斯·高特在《德文杂志》上推广...

    C语言 八皇后问题实现

    ### C语言实现八皇后问题解析 #### 一、八皇后问题简介 八皇后问题是一个经典的回溯算法案例,最早由国际象棋爱好者马克斯·贝塞尔于1848年提出,后经由数学家卡尔·弗里德里希·高斯及詹姆斯·克拉克·马克斯韦尔...

    八皇后 递归实现 c++ 算法

    ### 八皇后问题的递归实现与C++代码解析 #### 问题背景及目标 **八皇后问题**是一个经典的计算机科学问题,其目标是在8×8的国际象棋棋盘上放置8个皇后,使得任意两个皇后都不会互相攻击。根据国际象棋规则,皇后...

    在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击

    ### 八皇后问题详解 #### 一、问题背景与定义 八皇后问题是一个经典的问题,在计算机科学领域中常被用来作为回溯算法的教学案例。这个问题最早由著名的德国数学家卡尔·弗里德里希·高斯于1850年提出。其基本描述...

    No33.rar_算法设计

    3. **残缺棋盘问题**:可能是指在不完整的棋盘上进行某些棋类游戏,如八皇后问题,要求在8x8的棋盘上放置8个皇后,使得任意两个皇后都不在同一行、同一列或同一对角线上。这类问题通常涉及回溯法或动态规划来求解。 ...

    C++信息学奥赛一本通1213深搜题解

    1213:八皇后问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 33706 通过数: 12525 【题目描述】 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。 【输入】 (无) 【输出】 按给定顺序和...

    算法设计与分析的经典问题

    #### 题目1:N皇后问题(八皇后问题的扩展) **背景介绍**: N皇后问题是经典的回溯法问题之一,其核心是在N×N的棋盘上放置N个皇后,使得任意两个皇后不在同一行、同一列或同一对角线上。当N=8时,该问题就退化成...

    No-025.Algorithm

    6. **回溯法和贪心策略**:这些方法用于解决组合优化问题,例如八皇后问题、N皇后问题,或者在任务调度、资源分配等问题中。 7. **递归**:递归是Python中常见的解决问题的方式,比如计算阶乘、斐波那契数列等。 8...

    第一百题 UVAa750 8 Queens Chess Problem 目之所及 皆是遗憾

    终于写够一百道题啦,怎么也没想过他是这样来临的,在一个阳光明媚的冬日,写完第九十九题之后还是非常激动的,不知道第一百题做什么好,ACM群里不知怎么的就讨论起了八皇后问题(好像还是因为我发了一个非常奇怪的...

    福建省宁化县八年级英语上学期第十八周周考试题(无答案) 人教新目标板 试题.doc

    该文档是针对福建省宁化县八年级学生的英语周考试题,属于中学教育范畴,特别是中学英语教学的内容。试卷主要测试学生的英语词汇理解、句子翻译以及语法应用能力。 试卷分为三个部分:英汉互译、根据汉语提示完成...

    搜索算法全集.pdf

    - **应用场景**:适合解决组合优化问题,如八皇后问题、旅行商问题等。 - **优缺点**:空间占用较少,但在某些情况下可能会出现大量的回溯,导致时间效率较低。 ##### 2. 深度优先搜索与广度优先搜索 - **深度优先...

    课时作业代码aaaaa

    学生可能用它来解决如八皇后问题、迷宫问题或图的着色问题。 这些文件名涵盖了从基础的数据结构到高级的软件设计概念,表明这是一份综合性的编程作业,涉及了计算机科学的多个领域。学生通过这些项目,不仅锻炼了...

    ACM程序设计指导电子书

    包括皇后问题和迷宫问题,前者要求在棋盘上放置皇后而不冲突,后者涉及路径寻找算法,如深度优先搜索或广度优先搜索。 综上所述,ACM程序设计指导电子书涵盖了广泛的程序设计知识,从基础语法到高级算法,旨在全面...

    迷宫操纵:迷宫般的迷宫。 我正在使用这个项目来学习回溯

    这个项目不仅让你熟悉了Python编程,还让你掌握了回溯法这一重要的算法思想,这对于解决许多其他类型的问题,如八皇后问题、图着色问题等都非常有用。继续深入学习和实践,你将在IT领域变得更加专业。

Global site tag (gtag.js) - Google Analytics