全排列的解法

全排列可以用深搜的方式求解。解答树如下:

可以运行的代码:

import java.util.ArrayList;
import java.util.List;

public class Perm {
	public static Integer[] data = {19, 37, 61, 79, 89};
	public static int depth;
	public static List<Integer> res = new ArrayList<Integer>();
	public static int cnt = 0;

	public static void main(String[] args) {
		perm();
		System.out.println(cnt);
	}

	public static void perm() {
		if(depth == data.length) {
			System.out.println(res);
			cnt ++;
			return ;
		}
		for(int i=0; i<data.length; i++)
			if(!res.contains(data[i])){
			res.add(data[i]);
			depth++;
			perm();
			res.remove(res.size() - 1);
			depth--;
		}

	}
}

全排列的解法,布布扣,bubuko.com

时间: 2024-10-11 18:00:30

全排列的解法的相关文章

算法设计方法:递归的内涵与经典应用

摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的思维方式.对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓.灵活地运用递归思想来解决问题却并不是一件容易的事情.本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘.斐波那契

数据-第19课-递归的应用实战一

第19课-递归的应用实战一 1. 递归的数学思想 (1)      递归是一种数学上分而自治的思想. (2)      递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理. (3)      递归需要有边界条件. l  当边界条件不满足时,递归继续进行. l  当边界条件满足时,递归停止. 2 . 递归的数学表示 n > 1 n==1 (1)斐波拉契数列递归解法 #include <stdio.h> int fibonacci(int n) { if( n > 1 ) {

[Wikioi 1294]全排列---两种不同的解法(复习)

题目描述 Description 给出一个n, 请输出n的所有全排列 输入描述 Input Description 读入仅一个整数n   (1<=n<=10) 输出描述 Output Description 一共n!行,每行n个用空格隔开的数,表示n的一个全排列.并且按全排列的字典序输出. 样例输入 Sample Input 3 样例输出 Sample Output 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 数据范围及提示 Data Size & Hint

全排列的一种解法(函数方程)

题目:n个同学排成一队,一共多少种排法?设n个同学排队,共有f(n)种排法,再插入一个,对于原来已经排列的每种队型,可以放在第1位,第2位...n+1种可能,得到函数方程:f(n+1)=(n+1)f(n),解方程如下:

生成n个元素的全排列 C实现

近期在准备复习算法设计的考试,下边记录一些,看笔记时突然想到的解法. 问题是这种 用递归实现 n 个元素的全排列. 当时老师给出的解答是 假定第i个元素 ri 放在首位,于是 f(r1,r2,-,rn) = f(ri U {r1, r2,-.,rn}) = U (ri & f(r1,r2, -, rn)), 当时应该是听懂了,只是如今看到这个笔记.又醉了. (这货竟然是我上课记的笔记 .... . .. .) 后来自己细致想想,事实上非常简单的 一个问题, 利用回溯法,把问题看成是一个排列树.能

求数字或者字符串的全排列

以数字举例:有一个数组A的数为 :1 2 3 4 ,其按字典序列的全排列为: 1 2 3 4 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2 2 1 3 4 2 1 4 3 2 3 4 1 ---. 总共有 n!个排列,现在输入一个数K,输出其第K的排列 方法:采用康托编码的思想,其实就是求出每个位置上的数字:第一个位置的数字,第二个位置的数字.... 解法:按顺序求出每个位置上的数,这边假设 K=8 :数组为:1 2 3 4 ,长度为4,位置p代表数组中第P个数:p=k/ (n

《编程之法》1.3字符串的全排列,组合,重复排列,八皇后问题

题目描述:输入一个字符串,打印出该字符串中字符的所有排列,例如输入"abc",输出"abc","acb","bac","bca","cab","cba" 解法一:递归实现 类似于图的深度遍历搜索求全路径的算法,每次交换两个数,并输出,按照递归的方法,如求abcd的全排序,1:先求abcd后面的bcd全排列(同样先求b后面cd的全排列,然后b与后面的元素依次交换);2:

算法学习(二) 全排列问题的非递归算法——模拟堆栈

前一段时间总结了全排列问题的几种递归解法,今天再总结一下如何通过对系统栈行为的模拟来非递归的实现全排列问题. 我们用一个数组stack[]来表示一个栈,用一个top指针来表示栈顶,用一个flags[]数组来标示每一个数字的可用性:用i来表示当前的状态. 初始状态top=0:i=-1:flags数组全为1: i递增,如果i没有越界并且flags[i]==1,那么就将i写入栈中,栈顶往前移动一位:最后把flags[i]赋值为0,i回溯到初始状态-1: 当栈顶越界,就将整个栈的信息打印出来,然后top

[LeetCode] Find Permutation 找全排列

By now, you are given a secret signature consisting of character 'D' and 'I'. 'D' represents a decreasing relationship between two numbers, 'I' represents an increasing relationship between two numbers. And our secret signature was constructed by a s