`
knight_black_bob
  • 浏览: 853135 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

八皇后算法 回溯 递归 java

阅读更多

 

八皇后算法 回溯 递归 java

 

 


          

            国际象棋棋盘                               其中 一种解法
 
 

 

算法:

1.判断 是否是 在米字形 上

2. 递归查找 下一个,没有,返回上一行,换一个位置继续查找(n 盘 n 皇后问题,一行有且之有一个位置)

 

 



 

 

代码

import java.util.concurrent.atomic.AtomicInteger;

public class EightQueue {
	 
	public static void main(String[] args) {
		// testCheck(); 
		for (int i = 4; i < 9; i++) {
			int rows = i; //行 一排
			int cols = i; //列
			int [][] queue = new int[rows][cols];
			AtomicInteger backtrack = backtrack(queue,0,new AtomicInteger(0));
			System.out.println(i+"阶"+backtrack.get());
		}
	} 
	
	static AtomicInteger backtrack(int [][] queue,int row,AtomicInteger ai){
		int rows = queue.length ;
		int cols = queue[0].length ;  
		
		if (row == -1) {
			return ai;
		} 
		if (row == rows) { 
			ai.getAndIncrement();
			//System.out.println("第"+ai.get()+"种解法");
			//print(queue); 
			//System.out.println();
			
			return backtrack(queue, row-1,ai);
		} 
		
		int j = 0;
	    for (int i = 0 ; i< rows; i++) {
	    	if (queue[row][i] == 1) {
				j = i+1;
				queue[row][i] = 0;
			}
		}
		boolean flag =false;
		for (; j < cols; j++) {
			if (!flag && check(row, j, queue)) {
				queue[row][j] = 1; 
				flag =true;
			}
		}
		if (!flag) { 
		   return	backtrack(queue, row-1,ai);
		}
		return backtrack(queue, row+1,ai);
	}
	
	static void print(int [][] queue){ 
		int rows = queue.length;
		int cols = queue[0].length; 
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				System.out.print(queue[i][j]);
			}
			System.out.println();
		}
	}
	
	static void testCheck(){
		int rows = 8; //行 一排
		int cols = 8; //列
		int x= 1,y =1;
		
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				int [][] queue = new int[rows][cols];
				queue[i][j] = 1;
				boolean check = check(x, y, queue);
				System.out.print(check +" ");
			}
			System.out.println();
		}
		
//		false false false true  true  true  true  true 
//		false false false false false false false false 
//		false false false true  true  true  true  true 
//		true  false true  false true  true  true  true 
//		true  false true  true  false true  true  true 
//		true  false true  true  true  false true  true 
//		true  false true  true  true  true  false true 
//		true  false true  true  true  true  true  false 
	}

	
	
	static boolean check(int x,int y ,int [][] queue){
		int rows = queue.length;
		int cols = queue[0].length;
		//判断四条线是否有冲突
		//1.横向是否有冲突
		for (int i = 0; i < cols; i++) {
		  if (queue[i][y] == 1) {
			return false;
		  }
		}
		//2.纵是否有冲突
		for (int i = 0; i < rows; i++) {
		  if (queue[x][i] == 1) {
			return false;
		  }
		}
		//3.米撇是否有冲突
		for (int i = 0; i < rows; i++) {
			  if ( y-i+x >= 0 && y-i+x <= rows-1  && queue[y-i+x][i] == 1) {
				return false;
			  }
		 }
		//4.米捺是否有冲突
		for (int i = 0; i < rows; i++) {
			  if ( y-x+i >= 0 && y-x+i <= rows-1 && queue[i][ y-x+i] == 1) {
				return false;
			  }
		 }
		return true;
	}
	
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者 

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。

 

个人主页http://knight-black-bob.iteye.com/



 
 
 谢谢您的赞助,我会做的更好!

  • 大小: 871.6 KB
  • 大小: 46.5 KB
  • 大小: 3.2 KB
0
0
分享到:
评论

相关推荐

    八皇后回溯递归.java

    递归回溯算法解决八皇后问题,并分析回溯思想的相关理解,以及八皇后问题的代码分析,有一定的代码注释。有良好的代码风格。

    N皇后经典算法--回溯递归

    N皇后问题是一个经典的计算机科学问题,源自于19世纪的数学家高斯提出的八皇后问题。它要求在N×N的棋盘上放置N个皇后,使得任意两个皇后都无法互相攻击,即任意两个皇后不在同一行、同一列或同一对角线上。这个问题...

    八皇后算法的java实现源代码

    八皇后问题是一个经典的回溯算法案例,它的目标是在一个8×8的棋盘上放置八个皇后,使得任意两个皇后之间都不在同一行、同一列或同一斜线上。这个问题在计算机科学中被广泛用作演示如何使用递归和回溯算法解决复杂...

    经典算法八皇后问题的详解以及回溯(递归)代码示例

    对经典算法八皇后问题的说明,以及代码示例,代码中有详尽的注释,有助于读者充分理解其递归调用的逻辑!

    八皇后问题实验报告递归非递归javaC语言+分析可用.pdf

    八皇后问题有多种解决方案,包括递归算法和非递归算法。递归算法使用递归函数来尝试不同的皇后摆放方式,而非递归算法则使用循环来实现皇后摆放。 3.递归算法的实现 递归算法的实现需要使用递归函数来尝试不同的皇后...

    C++源代码 八皇后问题非递归实现

    八皇后问题,用递归算法非常典型。这里用栈来进行回溯。运行过后没有问题。新手,请指点。

    回溯算法java实例

    八皇后问题则是经典的回溯算法应用例子,目标是在8x8的棋盘上放置8个皇后,使得任意两个皇后都不在同一行、同一列或同一斜线上。这个问题可以通过维护一个表示皇后位置的数组来解决,每行对应一个数组元素,值表示...

    C#+八皇后问题的递归算法

    两者的内核差不多,主要是皇后类成员的设计以及回溯算法的实现。可视化模式可以将结果直观地显示在Form上,包括解的个数,棋盘和皇后的摆放,上一个解的显示,下一个解的显示等。注意采用可视化模式观看运行结果的...

    算法分析 递归与分治策略 动态规划 贪心算法 分支限界法 随机化算法等算法

    常用于求解组合优化问题,如八皇后问题和旅行商问题。回溯法结合剪枝技术,可以有效地减少搜索空间,提高求解效率。 5. **分支限界法**: 分支限界法与回溯法类似,也是用来搜索问题解空间的全局最优解。但它通过...

    Java基于循环递归回溯实现八皇后问题算法示例

    Java基于循环递归回溯实现八皇后问题算法示例 Java八皇后问题是一种典型的回溯算法问题,目标是将8个皇后放在8x8的棋盘上,使得每个皇后都不能被其他皇后攻击。Java基于循环递归回溯实现八皇后问题算法示例主要介绍...

    八皇后算法C语言实现

    八皇后问题是一个经典的计算机编程问题,源于19世纪由国际象棋大师马克斯·...尽管实现过程可能复杂,但通过八皇后问题的学习,我们可以深入理解C语言编程和回溯算法,这对于提升编程能力和解决问题的能力大有裨益。

    .net 递归算法 .net 递归算法.net 递归算法

    - **回溯法**:在解决组合优化问题,如八皇后问题、N皇后问题、迷宫问题时,递归结合回溯可以找出所有可能的解决方案。 递归算法在使用时需要注意几个关键点: - **效率**:递归可能导致大量的函数调用,增加内存...

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

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

    算法 回溯 动态递归 分支限界 图 etc.

    回溯常用于解决组合优化问题,如八皇后问题、迷宫问题和数独等。 2. **动态规划**:动态规划是一种用于求解最优化问题的算法,其基本思想是将复杂问题分解为子问题,并存储子问题的解,避免重复计算。例如,著名的...

    八皇后问题之递归法求解

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。这里提供一个C++语言的递归法的实现,代码已在VS2008下编译通过。相关博文地址: http://blog.csdn.net/jocodeoe/article/details/7067955

    C++八皇后问题代码,递归实现

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...

    java数据结构递归算法

    在这个"java数据结构递归算法"主题中,我们将深入探讨递归的基本概念、如何在Java中使用递归,以及一个著名的递归应用案例——八皇后问题。 递归是函数或方法调用自身的过程。它基于一个问题的规模缩小至基本情况,...

    15个典型的递归算法的JAVA实现

    15个典型的递归算法的JAVA实现,求N的阶乘、欧几里德算法(求最大公约数)、斐波那契数列、汉诺塔问题、树的三种递归遍历方式、快速排序、折半查找、图的遍历、归并排序、八皇后问题(回溯、递归)、棋盘覆盖(分治,...

    C++递归实现八皇后问题

    通过递归,八皇后问题可以高效地找到所有可能的解决方案,体现了递归在解决复杂问题时的强大能力。同时,这个算法也展示了回溯法在处理约束满足问题中的应用,当一条路径无法达到目标时,会返回上一步寻找其他可能的...

    八皇后递归解法

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

Global site tag (gtag.js) - Google Analytics