`
阅读更多

java版迭代回溯算法和递归回溯算法

上完回溯法的算法后,为了避免以后忘记了这些算法,自己实现了一遍,仅供大家学习参考,以下是代码:

package ctong;

import java.util.Random;

public class NQueen {
	/**
	 * ctong
	 */
	//可行解数组,从X[1]开始使用
	private static int[] X ;
	//X数组的长度
	private static int nn ;
	//记录可行解数目
	private static int sum=0;
	/**
	 * 迭代算法
	 */
	public void iteration(int n){
		int k=1;
		while(k>0){
			X[k]++;
			while(X[k]<n&&!place(k)){
				X[k]++;
			}
				if(X[k]<n){
					if(k==n-1){
						print();
					}
					else{
						k++;
						X[k]=0;
					}
				}else k--;
		}
	}
	/**
	 * 递归算法
	 */
	public void recursion(int p){
		for(X[p]=1;X[p]<nn;X[p]++){
			if(place(p)){
				if(p==nn-1){
					print();
				}else{
					//递归调用
					recursion(1+p);
				}
			}
		}
	}
	//是否可以放置?
	public boolean place(int t){
		for(int i=1;i<t;i++){
			if(Math.abs(i-t)==Math.abs(X[i]-X[t])||X[i]==X[t])
				return false;
		}
		return true;
	}
	//创建一个随机长度(5~8)的数组
	public static int[] createArray(){
		nn =new Random().nextInt(3)+5;
		int[] a = new int[nn];
		for(int i =0;i<nn;i++)
			a[i]=0;
		return a;
	}
	//打印函数
	public void print(){
		sum++;
		System.out.println("可行解"+sum);
		for(int j=1;j<X.length;j++)
		System.out.print(X[j]+" ");
		System.out.println();
	}
	/**
	 * 主函数
	 * @param args
	 */
	public static void main(String[] args) {
		X=createArray();
		System.out.println("迭代回溯算法求得"+(X.length-1)+"皇后的可行解为:");
		new NQueen().iteration(X.length);
		System.out.println("可行解的个数是:"+sum);
		sum=0;
		System.out.println("递归算法求得"+(X.length-1)+"皇后的可行解为:");
		new NQueen().recursion(1); 
		System.out.println("可行解的个数是:"+sum);
	}

} 

 

0
0
分享到:
评论

相关推荐

    n后问题--非递归迭代回溯.rar

    n后问题--非递归迭代回溯.rar n后问题--非递归迭代回溯.rar n后问题--非递归迭代回溯.rar n后问题--非递归迭代回溯.rar n后问题--非递归迭代回溯.rar n后问题--非递归迭代回溯.rar

    「代码随想录」回溯算法精讲(v1.1).pdf

    1. 回溯算法的核心思想是使用递归或迭代的方式遍历所有可能的解空间,在解空间中进行搜索,一旦发现当前解不可能是正确的解,则回溯到上一个步骤,尝试其他可能的路径。 2. 回溯算法的典型应用场景包括迷宫问题、N...

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

    因此,非尾递归或深度较大的递归可能需要优化,如使用迭代代替或者尾递归优化。 - **终止条件**:确保每个递归调用都向基础情况靠近,否则可能会导致无限递归。 - **理解问题与分解**:正确理解和分解问题是成功...

    matlab中_回溯算法 模拟退火算法-matlab

    根据给定的MATLAB代码和描述,我们可以深入探讨回溯算法和模拟退火算法在解决旅行商问题(TSP)中的应用。 ### 回溯算法 回溯算法是一种通过尝试解决子问题并撤销不成功的解决方案来寻找问题解答的算法。在TSP中,...

    递归方程组解的渐进阶的求法,算法时间复杂度,迭代算法,递归算法

    递归方程组解的渐进阶的求法是计算机科学与技术中分析算法效率的重要手段,特别是对于理解和优化算法的时间复杂度具有关键作用。在分析递归算法时,我们通常关注在最坏情况下的时间复杂性,这涉及到对递归方程解的...

    backtracking_N皇后_01背包_回溯算法_售货员问题_图的m着色_

    回溯算法通过迭代地放置皇后并检查冲突来解决此问题。每一步,我们尝试在当前行的每个列放置皇后,如果找到一个不冲突的位置,就进入下一行;如果所有位置都有冲突,则回溯到上一行,尝试放置在其他列。 2. **01...

    C++回溯算法实验报告

    回溯算法是一种在问题的解空间树中,按照深度优先搜索策略,通过剪枝操作避免无效搜索,从而求解问题的算法。...通过实验,学生不仅可以加深对回溯算法的理解,还能提高实际编程和问题解决的能力。

    067回溯算法的实现及实例_回溯算法实现实例_

    回溯算法是一种强大的问题求解方法,常用于解决组合优化问题和搜索问题。它通过尝试所有可能的解决方案路径,一旦发现某个路径无法达到目标,就会撤销该路径的选择,退回上一步,继续探索其他可能性,直到找到一个...

    Java实现N皇后问题的算法

    这是一个用Java实现的关于N皇后问题的算法 其中包括回溯和迭代两种算法

    矩阵着色问题;回溯算法;微软面试;

    这个问题通常与图的染色相关,可以被转化为一个回溯算法的实例。在微软的面试中,这种问题可能会被用来测试候选人的逻辑思维和问题解决能力。 矩阵着色问题的基本设定是这样的:给定一个二维矩阵,每个单元格可以被...

    acm递归算法总结竞赛

    2. **基本原理**:递归算法通常包括两个部分:递归规则(如何将大问题分解为小问题)和终止条件(何时停止递归)。递归规则描述了如何将问题规模减小,而终止条件确保递归不会无限进行下去。 3. **类型**:递归可以...

    回溯法迭代

    递归回溯,像8皇后问题,本质上和多重for 循环是一样的

    c语言爬楼梯回溯算法

    在C语言中实现回溯算法可以帮助初学者理解这种算法的基本思想和实现方式。下面我们将深入探讨回溯算法的概念、应用场景以及如何用C语言来实现爬楼梯问题。 回溯算法主要应用于解决组合优化问题,如八皇后问题、迷宫...

    信息学奥赛一本通-教程PPT课件(第五版)算法部分 第五章 搜索与回溯算法.pdf

    信息学奥赛中常见的搜索与回溯算法涉及到多个经典问题的解决方案,这类算法利用了深度优先搜索的原理,通过递归的方式,穷举所有可能的路径来找到问题的解答,如果发现当前的路径不可能产生期望的结果,则返回上一步...

    两种回溯算法

    确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。...回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。

    N皇后求解问题——递归和回溯方法

    这个问题常用于演示回溯算法和递归在解决约束满足问题中的应用。 首先,我们来探讨递归方法。在C语言中,递归是一种函数调用自身的技术。对于N皇后问题,我们可以定义一个递归函数,该函数尝试在当前行放置皇后,并...

    回溯法实验报告解装载问题

    7. **程序流程**:源程序中包含两个关键方法,`bool Queen::Place(int k)`负责检查皇后放置的合法性,而`void Queen::Backtract(int t)`实现了回溯算法的递归搜索过程。`int nQueen(int n)`是主入口,初始化`Queen`...

    算法分析与设计实验报告利用回溯算法解决背包问题

    通过这个实验,学生可以深入理解回溯法的基本原理,掌握如何构建解空间树,以及如何使用递归和迭代两种方法实现回溯算法。同时,通过对不同测试数据的处理,可以评估算法在解决实际问题时的性能。

    回溯法 算法

    回溯算法通常能够以高效的方式搜索整个解空间,尤其在解空间庞大时,由于解空间树的剪枝,回溯法能够显著减少不必要的搜索,提高求解效率。回溯法是计算机科学和数学领域的重要算法之一,它在解决优化问题、搜索问题...

    代码随想录 动态规划、回溯、递归、二叉树、贪心

    书中可能通过实例详细解释了如何设计和实现回溯算法。 递归(Recursion)是函数自身调用自身的一种方式,通常用于解决具有自相似性质的问题。递归可以简化代码,但也可能导致栈溢出。常见的递归问题包括阶乘计算、...

Global site tag (gtag.js) - Google Analytics