递归,还是回溯?选择了递归,记得回溯算法,以前课程设计做的一个迷宫程序涉及到。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.xiva.baseKnowledge;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* @Description "4"不能在第三位,"3"与"5"不能相连
* @author XIVA
*/
public class Arrangement {
//static int numArray[] = {1, 2, 2, 3, 4, 5};
static int numArray[] = {1, 2, 2, 3, 4, 5};
//static int[] result = {0,0,0,0,0,0};
static int[] result = new int[numArray.length];
static int index = 0;
static int count = 0;
static boolean isOut = false;
static Set arraySet = new LinkedHashSet();//存储
public static int getArrangement(int array[]){
boolean checkOut = true;
if(array.length < 1){
//System.out.print("Start:");
for(int j = 0; j < result.length; j++){
//System.out.print(result[j]);
//业务判断过滤
if(result[j] == 4 && j == 3){
checkOut = false;
}
if( result[j] == 3){
if((j>0 && result[j-1] == 5) || (j < result.length - 1 && result[j + 1] == 5)){
checkOut = false;
}
}
}
//System.out.println("");
isOut = true;
String reStr = Arrays.toString(result);
//arraySet.contains(reStr)可以不需要判断
if(arraySet.contains(reStr) || !checkOut){
System.out.println(reStr);
}else{
arraySet.add(reStr);
}
count = count + 1;
return 1;
}
for(int i = 0; i < array.length; i ++){
//此处还可以简化
int[] headArray = Arrays.copyOfRange(array, 0, i);
int[] footArray = Arrays.copyOfRange(array, i + 1, array.length);
int[] newArray = new int[headArray.length + footArray.length];
//数组复制
System.arraycopy(headArray, 0, newArray, 0, headArray.length);
System.arraycopy(footArray, 0, newArray, headArray.length, footArray.length);
if( isOut){
index = numArray.length - array.length;
isOut = false;
}
result[index] = array[i];
index = index + 1;
//if( newArray.length > 0)
//递归调用
getArrangement(newArray);
}
return 0;
}
public static void main(String[] args){
getArrangement(numArray);
System.out.println(count);
System.out.println(arraySet.size());
}
}
最终,set中存放的是类似于“[5, 4, 3, 2, 2, 1]” 的字符串。这样即使使用10以上的数进行排列,也保证了数据的正确性。
本题目中未加入过滤是的结果个数应该是:6!/2!
当然这个排列算法只考虑了排列的一种情况那就是全排列。
分享到:
相关推荐
递归法是一种函数或过程调用自身的技术,通过不断自我调用来解决问题,尤其适用于数据结构如树、图以及数学上的排列组合计算。 排列组合是组合学中的基本概念,排列是指从n个不同元素中取出m(m≤n)个元素,按照...
排列组合算法的递归实现 排列组合是数学中的一种基本概念,指的是从一个集合中选择若干个元素,考虑其顺序的排列方式。排列组合的计算在计算机科学和数学中有非常广泛的应用,例如数据分析、机器学习、密码学等领域...
通过查看这个文件,我们可以了解具体的实现细节,包括使用的数据结构、递归或非递归的策略,以及如何处理边界条件等。 总的来说,组合排列是解决许多实际问题的基础,包括优化、概率计算和统计分析等。理解和掌握这...
其实排列实现了,组合也就实现了,组合C(N,R)就是P(N,R)/P(R,R) ,实现这一功能比较简单的是递归算法,但考虑到递归的性能,下面采用了2种非递归的方法,具体代码如下 using System; using System.Collections....
本文将详细探讨如何使用C语言来实现排列组合算法,并结合递归解决P(m,n)问题。 首先,我们要理解排列和组合的基本概念。排列是指从n个不同元素中取出m个元素,按照一定的顺序进行排列,其数量由阶乘表示,即P(m,n) ...
汉诺塔(Hanoi)问题是一个经典的递归算法问题,起源于19世纪法国数学家爱德华·卢卡斯提出的一个智力游戏。这个游戏中有三个柱子和一堆大小不一的圆盘,所有圆盘起初都堆在第一个柱子上,按照由大到小的顺序...
在数学上,排列是指从n个不同元素中取出m(m≤n)个元素的所有可能的顺序。如果m=n,即取出所有元素进行排列,那么这个操作称为全排列。对于给定的数据集合,其总排列个数可以通过阶乘来表示,即n!(n的阶乘),即n ...
汉诺塔(Hanoi Tower)是一个经典的计算机科学问题,它源于19世纪由法国数学家爱德华·卢卡斯提出的。这个问题的目标是将一个柱子上的所有盘子,通过两个辅助柱子,按照特定规则移动到另一个柱子上。汉诺塔游戏通常...
排列组合是组合数学中的重要概念,递归可以用来计算组合数(C(n,k)),或者生成所有可能的组合。非递归实现通常涉及动态规划或循环结构,如Fibonacci序列的矩阵快速幂算法。 1. **组合问题**:不考虑元素顺序,只需...
Fibonacci数列是数学中一个非常著名的数列,它由以下递归定义: - F(1) = 1 - F(2) = 1 - 对于所有 n > 2,有 F(n) = F(n-1) + F(n-2) 这个数列起源于意大利数学家斐波那契(Leonardo Fibonacci)提出的一个兔子...
本压缩包“易语言源码排列组合模块(M选N)源码.rar”提供了实现M选N排列组合功能的源代码,适用于学习易语言编程、算法设计以及组合数学的应用。排列组合是组合学中的基本概念,对于理解和解决许多实际问题,如概率...
(一)非递归全排列算法基本思想是: 1.找到所有排列中最小的一个排列P. 2.找到刚刚好比P大比其它都小的排列Q, 3.循环执行第二步,直到找到一个最大的排列,算法结束.下面用数学的方法描述:给定已知序列 P = A1A2A3...
为了实现全排列算法的递归,我们需要定义一个递归函数,该函数具有至少两个参数:当前的排列状态和未排列元素的列表。每次递归调用时,都将当前选择的元素加入到排列状态中,并从未排列列表中移除该元素。当未排列...
首先,排列和组合是离散数学中的基本概念。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列起来,形成不同的排列方式。组合则是指从n个不同元素中不考虑顺序取出m个元素的方法数量。在PHP中,我们...
全排列的常见实现方式有两种:递归排列和字典序排列。 1. **递归排列**: - **递归实现方法一**:该方法通过交换元素来生成排列。首先选择一个元素作为排列的第一个元素,然后对剩下的元素进行递归全排列。当长度...
广义表的定义通常涉及到递归的函数,以描述表内的元素如何按照一定的顺序排列。 总结来说,递归数据结构的数学定义往往需要采用递归的方式,将结构中的每个部分与整体联系起来,以便能够准确地反映其层级和递归性质...
圆排列是一个经典的组合数学问题,它涉及到在圆形表上摆放n个不同的对象,使得每两个相邻的对象都不相同。我们还将讨论EasyX库的使用,这是一个方便的图形用户界面库,用于在C++中进行图形绘制。 首先,让我们了解...
汉诺塔问题是一种经典的递归算法示例,但同样也可以通过非递归的方式进行实现。在给定的C++代码中,我们看到了一种不依赖于递归调用来解决汉诺塔问题的方法。以下是对该非递归程序的详细解析: ### 汉诺塔问题背景 ...