`

回溯法 - 输出自然数1到n所有不重复的排列,即n的全排列

J# 
阅读更多
1. 问题描述: 输出自然数1到n的所有不重复的排列,即n的全排列。

2. 问题分析:

   (1) 解空间: n的全排列是一组n元一维向量(x1, x2, x3, ... , xn),搜索空间是:1<=xi<=n i=1,2,3,...,n
  
   (2) 约束条件: xi互不相同。技巧:采用"数组记录状态信息", 设置n个元素的一维数组d,其中的n个元素用来记录数据
1~n的使用情况,已使用置1,未使用置0

3. Java代码:

package boke;

/**
 * 回溯法
 * 
 * @since jdk1.6
 * @author 毛正吉
 * @version 1.0
 * @date 2010.05.25
 * 
 */
public class NAllArrangement {
	private int count = 0; // 解数量
	private int n; // 输入数据n
	private int[] a; // 解向量
	private int[] d; // 解状态

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//测试例子
		NAllArrangement na = new NAllArrangement(5, 100);
		na.tryArrangement(1);

	}

	public NAllArrangement(int _n, int maxNSize) {
		n = _n;
		a = new int[maxNSize];
		d = new int[maxNSize];
	}

	/**
	 * 处理方法
	 * 
	 * @param k
	 */
	public void tryArrangement(int k) {
		for (int j = 1; j <= n; j++) { // 搜索解空间
			if (d[j] == 0) {
				a[k] = j;
				d[j] = 1;
			} else { // 表明j已用过
				continue;
			}

			if (k < n) { // 没搜索到底
				tryArrangement(k + 1);
			} else {
				count++;
				output(); // 输出解向量
			}
			d[a[k]] = 0; // 回溯
		}
	}

	/**
	 * 输出解向量
	 */
	private void output() {
		System.out.println("count = " + count);
		for (int j = 1; j <= n; j++) {
			System.out.print(a[j] + " ");
		}
		System.out.println("");
	}

}


分享到:
评论

相关推荐

    n后问题---递归回溯法 n后问题---递归回溯法

    n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---...

    回溯法---n皇后问题,c语言编程

    回溯法---n皇后问题,c语言...回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程

    输出1到n的所有排列

    在本示例中,我们使用了编程来生成1到n的所有全排列,这里主要涉及到了回溯法(Backtracking)这一算法。 回溯法是一种试探性的解决问题的方法,它尝试通过递归地枚举所有可能的解决方案来找到正确的答案。在遇到...

    圆排列问题-回溯法-排列集

    在圆排列问题中,我们使用回溯法来搜索所有可能的排列,并找到一个最佳的排列。 在这个java程序中,我们首先定义了一个数组a来存储圆的长度,然后定义了几个变量来存储当前的长度、最佳的长度和最佳的排列。在main...

    用回溯法求序列的全排列

    回溯法的优点在于可以避免重复计算,只需要在每个分支上尝试所有可能的选择,直到找到解决方案或者确定无解。缺点是效率通常低于动态规划等其他算法,因为它可能涉及到大量的回溯操作。然而,对于小规模的问题,如本...

    回溯法-N皇后问题_N皇后回溯法C++_

    回溯法是一种在解决问题时,通过尝试所有可能的解决方案,并在某一阶段发现某解不可能成立时,就回溯到上一步甚至更早的步骤,撤销刚才的决策,再尝试其他的可能性,直到找到正确答案的算法。在计算机科学中,尤其在...

    回溯法解决全排列问题

    用回溯法解决全排列问题:计算从1到N的N个整数所能构成的所有排列,并按照字典顺序依次输出。

    计算机数据结构-全排列回溯算法-java

    在全排列问题中,当我们尝试构建一个排列时,如果发现当前的排列不可能是有效的全排列,我们就回溯到上一步,改变当前元素的位置,继续尝试。 在Java中实现回溯算法进行全排列通常分为以下步骤: 1. 定义一个递归...

    java递归实现N个数全排列输出

    若发现当前的排列不可能是有效的全排列,就回溯到上一步,调整元素的顺序。 现在,我们来看如何用Java编写一个递归函数来实现全排列。首先定义一个方法,接受一个整型数组和一个整数N作为参数,表示当前处理到数组...

    输出n个整数的全排列

    全排列是指从n个不同元素中取出n个元素,按照一定的顺序排列,每一种排列都是一个不同的排列。例如,对于数字集合{1, 2, 3},全排列有:123, 132, 213, 231, 312, 321。 在C++中,我们可以使用递归的方式来实现...

    C++回溯算法实验报告

    在这个C++实验中,我们分别通过两个实例来探讨回溯法的应用。 首先,实验的第一个问题是删数问题。这个问题要求在给定的n位正整数a中去掉k个数字,使得剩下的数字排列成的新正整数尽可能大。为了解决这个问题,我们...

    动态规划法和回溯法求0-1背包问题

    ### 动态规划法与回溯法解决0-1背包问题 #### 一、实验目的与背景 0-1背包问题是一种经典的组合优化问题,在实际应用中有着广泛的用途,例如资源分配、投资组合等问题都可以抽象成背包问题的形式。本实验旨在通过...

    回溯法 0-1背包问题

    回溯法 0-1背包问题 计算机算法设计与分析 回溯法 背包问题

    回溯法-01背包问题 java

    ### 回溯法解决01背包问题 #### 一、问题背景及定义 在计算机科学领域,01背包问题是一个经典的组合优化问题。该问题的基本形式是:给定一组物品,每种物品都有对应的重量和价值,以及一个背包,背包有一定的承重...

    全排列算法(分治法求解法和回溯法)

    5. 当所有可能的位置都尝试过后,回溯到上一个元素,重复步骤4,直到所有排列都被找到。 总结,分治法和回溯法都是解决全排列问题的有效算法。分治法利用递归将问题分解,回溯法则通过试探和回溯寻找所有解。两者在...

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

    **回溯法是一种重要的算法策略,常用于解决组合优化问题,如八皇后问题、迷宫寻路等。在这个场景中,我们关注的是“n皇后问题”。n皇后问题是在一个n×n的棋盘上放置n个皇后,要求任何两个皇后不能处于同一行、同一...

    回溯法-算法课件

    回溯法-算法课件

Global site tag (gtag.js) - Google Analytics