`

数据结构应用回顾之递归(一) N皇后问题

 
阅读更多

 

问题: 求解N皇后问题的所有可能的解

 

package com.xx.dataStructure.stack;

//求解N皇后问题的所有解
public class Queen {
	
	private int solution = 0;
	
	private int n;
	
	public Queen(int n){
		assert(n > 0);
		this.n = n;
		this.solution = 0;
	}
	
	public static void main(String [] args){
		solveProblem(new Queen(1));
		solveProblem(new Queen(2));
		solveProblem(new Queen(3));
		solveProblem(new Queen(4));
		solveProblem(new Queen(5));
		solveProblem(new Queen(6));
		solveProblem(new Queen(7));
		solveProblem(new Queen(8));
	}
	
	public static void solveProblem(Queen queen){
		int [] queens = new int[queen.n];
		System.out.println(  queen.n + " 皇后问题.....");
		placeQueen(queens,1,queen);
	}
	
	//放置第n个Queen
	//N为总共要放的Queen个数
	public static void placeQueen(int [] queens,int n,Queen queen){
		for(int i = 0; i< queen.n ; i ++){
			if (canPlaceQueen(queens,n-1,i)) {
				queens[n-1] = i;
				if (n == queen.n){
					//output
					System.out.println("the " + ++queen.solution +" th solution");
					for(int i0 = 0; i0 < queen.n; i0++){
						for(int j0 = 0; j0 <queen.n ;++j0){
							if (j0 == queens[i0] ){
								System.out.print("Q ");
							}else {
								System.out.print("X ");
							}
						}
						System.out.println();
					}
					System.out.println();
					break;
				}else {
					placeQueen(queens,n+1,queen);
				}
			}
		}
	}
	
	//
	public static boolean canPlaceQueen(int [] queens,int placedQueenNum,int y){
		boolean result = true;
		for(int i = 0; i < placedQueenNum ; ++i ){
			//在同一列 
			if ( queens[i] == y){
				result = false;
				break;
			}
			//在对角线
			if (Math.abs(placedQueenNum - i) == Math.abs(queens[i] - y)) {
				result = false;
				break;
			}
		}
		return result;
	}
}

   程序输出

  

1 皇后问题.....
the 1 th solution
Q 

2 皇后问题.....
3 皇后问题.....
4 皇后问题.....
the 1 th solution
X Q X X 
X X X Q 
Q X X X 
X X Q X 

the 2 th solution
X X Q X 
Q X X X 
X X X Q 
X Q X X 

5 皇后问题.....
the 1 th solution
Q X X X X 
X X Q X X 
X X X X Q 
X Q X X X 
X X X Q X 

the 2 th solution
Q X X X X 
X X X Q X 
X Q X X X 
X X X X Q 
X X Q X X 

the 3 th solution
X Q X X X 
X X X Q X 
Q X X X X 
X X Q X X 
X X X X Q 

the 4 th solution
X Q X X X 
X X X X Q 
X X Q X X 
Q X X X X 
X X X Q X 

the 5 th solution
X X Q X X 
Q X X X X 
X X X Q X 
X Q X X X 
X X X X Q 

the 6 th solution
X X Q X X 
X X X X Q 
X Q X X X 
X X X Q X 
Q X X X X 

the 7 th solution
X X X Q X 
Q X X X X 
X X Q X X 
X X X X Q 
X Q X X X 

the 8 th solution
X X X Q X 
X Q X X X 
X X X X Q 
X X Q X X 
Q X X X X 

the 9 th solution
X X X X Q 
X Q X X X 
X X X Q X 
Q X X X X 
X X Q X X 

the 10 th solution
X X X X Q 
X X Q X X 
Q X X X X 
X X X Q X 
X Q X X X 

6 皇后问题.....
the 1 th solution
X Q X X X X 
X X X Q X X 
X X X X X Q 
Q X X X X X 
X X Q X X X 
X X X X Q X 

the 2 th solution
X X Q X X X 
X X X X X Q 
X Q X X X X 
X X X X Q X 
Q X X X X X 
X X X Q X X 

the 3 th solution
X X X Q X X 
Q X X X X X 
X X X X Q X 
X Q X X X X 
X X X X X Q 
X X Q X X X 

the 4 th solution
X X X X Q X 
X X Q X X X 
Q X X X X X 
X X X X X Q 
X X X Q X X 
X Q X X X X 

.........

 

 

分享到:
评论

相关推荐

    数据结构和算法Flash动画演示

    1. **数组**:数组是最基础的数据结构之一,它在内存中连续存储相同类型的数据。动画演示可以展示数组的插入、删除和查找操作,以及一维、二维数组的概念。 2. **链表**:链表由一系列节点组成,每个节点包含数据和...

    数据结构1800题和答案

    数据结构是计算机科学中的核心课程之一,它研究如何在计算机中高效地组织和管理数据,以便进行快速查找、插入和删除等操作。本资源“数据结构1800题和答案”显然是为准备数据结构考试,尤其是考研的学生设计的,包含...

    C语言经典数据结构算法

    - **递归与分治**:如斐波那契数列、汉诺塔、八皇后问题等,递归是解决复杂问题的强大工具。 - **动态规划**:背包问题、最长公共子序列、最短路径等,通过构建状态转移方程解决优化问题。 - **图算法**:深度...

    小甲鱼_数据结构与算法(98集全)

    道01数据结构和算法绪论. mp402_谈谈算法. mp4 西03_时间复杂度和空间复杂度.mp404_时间复杂度和空间复杂度2.mp405_时间复杂度和空间复杂度3.mp4险06线性表. mp407_线性表2. mp408_线性表3. mp4品09_ 线性表4. mp...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    这本经典、畅销的数据结构教材详细介绍了数据抽象的基础知识,强调作为面向对象方法基础原理的规范和实施之间的区别。书中使用的软件工程原则和概念以及UML图便于增强学生的理解。 ◆ 详细介绍了数据抽象,强调规范...

    java算法源码大全

    6. **回溯法与分支限界**:在解决组合优化问题如八皇后问题、N皇后问题、旅行商问题中常见。 7. **贪心算法**:通过局部最优解逐步构建全局最优解,如霍夫曼编码、Prim's最小生成树算法等。 8. **递归与分治策略**...

    算法数据结构大师班

    8. **回溯法与分支限界法**:这些是用于解决约束满足问题和组合优化问题的方法,如八皇后问题、N皇后问题等。 9. **数据结构实现**:在JavaScript环境中,我们将学习如何实现上述数据结构,理解它们的内部工作原理...

    经典算法问题的java实现<一>

    8. **数据结构**:如栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)和图(Graph)等,它们是实现这些算法的基础。 在这个Java实现的压缩包中,`TypicalCode.java`很可能是包含一个或多个以上算法的...

    算法考试试卷

    8. **数据结构**:数组、链表、栈、队列、树、图等,理解它们的特性及操作,如二叉搜索树、平衡树(AVL、红黑树)等。 9. **递归与递推**:理解递归的基本概念,掌握递归函数的编写和递推公式的应用。 10. **...

    algorithm-analysis:数据结构与算法分析

    《数据结构与算法分析》是Mark Allen Weiss的经典著作,它主要关注的是计算机科学中的核心主题——数据结构和算法。这本书的1997年版以其深入浅出的讲解和丰富的实例,深受程序员和计算机科学学生的喜爱。"回到基础...

    算法高阶版(视频含代码)

    9. **回溯法**:用于解决组合优化问题,如八皇后问题、N皇后问题、数独求解等。 10. **编码实现**:视频教程会包含实际的编程实现,可能使用Java、C++、Python等常见编程语言,让学习者能亲手实践并理解算法的运行...

    算法笔记与其配套训练指南

    6. **递归与回溯**:递归是解决问题的一种简洁方式,而回溯则常用于解决组合优化问题,如八皇后问题、N皇后问题、数独等。 7. **贪心算法**:适用于有局部最优解可以导向全局最优解的问题,如霍夫曼编码、活动安排...

    递归调用的利与弊 (2000年)

    文章中提到了递归调用的几个关键优点:递归使得复杂问题的求解变得简单直观,它能够在不增加程序复杂性的情况下解决某些问题,例如在处理树形结构数据时,递归可以提供一种非常清晰的解决方案。同时,递归是解决诸如...

    计算机算法设计与分析期末考试复习资料汇总

    5. **递归与回溯**:理解递归的基本原理,掌握递归函数的设计,以及在解决组合优化问题(如八皇后问题、N皇后问题)中的回溯算法。 6. **字符串处理**:KMP算法、Boyer-Moore算法、Rabin-Karp算法等在字符串匹配中...

    算法分析与设计 试卷

    **算法分析与设计是计算机科学的核心领域之一,它涉及到如何有效地解决问题并编写高效的计算机程序。在本试卷中,我们将深入探讨这一主题,涵盖各种算法的分析、设计技巧以及实际应用。** **一、算法分析** 1. **...

    广工算法设计与分析

    广东工业大学(简称广工)的这门课程涵盖了算法的基本概念、常用数据结构、算法设计策略以及复杂度分析等多个方面。下面将围绕这些知识点进行详细的阐述。 一、算法基础 1. 算法定义:算法是一系列明确的步骤,用于...

    算法第四版

    7. **数据结构**:书中涵盖了一系列重要的数据结构,如数组、链表、栈、队列、哈希表、树(二叉树、平衡树如AVL和红黑树)和图等。理解这些数据结构的特性和操作是提升编程能力的基础。 8. **递归与迭代**:递归是...

    JAVA近百种算法大全打包.zip

    5. **回溯法**:用于解决组合优化问题,如八皇后问题、N-皇后问题、图的着色问题等。 6. **贪心算法**:在每一步选择局部最优解,期望最终得到全局最优解,如霍夫曼编码、Prim最小生成树算法、Kruskal最小生成树...

    华中科技大学中文算法课件

    学习者将了解到不同数据结构的特点及其在解决问题中的应用。 第三章:贪心法是解决优化问题的一种策略,这一章可能会详细解释贪心算法的工作原理,通过实例演示如何通过局部最优选择来达到全局最优解。同时,可能会...

Global site tag (gtag.js) - Google Analytics