据说有这样的一道排列组合试题,拿出来就当做做练习,来个痕迹保留......
/**
*如题: 给定六个数字:1、2、3、3、5、6,试求出满足下述要求的,用这六个数字组成的6位数的个数:
* 1) 两个数字3不能相邻,例如653321不允许
* 2) 数字5不能在第5位,例如132356不允许
*/
import java.util.*;
/**
* windows XP
* @author zxb
* @date 2009-07-09
* java version "1.4.2_09"
*/
public class ArrangeTest {
private ArrayList arrangeList = new ArrayList();
public ArrangeTest() {
}
private void swapData(String list[], int k, int i) {
String temp = list[k];
list[k] = list[i];
list[i] = temp;
}
public void genernateData(String list[], int k, int m) {
if (k > m) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i <= m; i++) {
sb.append(list[i]);
}
arrangeList.add(sb.toString());
} else {
for (int i = k; i <= m; i++) {
swapData(list, k, i);
genernateData(list, k + 1, m);
swapData(list, k, i);
}
}
}
public ArrayList filterNum() {// 过滤掉5在索引位置为4的 和 33不能相邻的数字
ArrayList l = new ArrayList();
Iterator it = arrangeList.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// 过滤掉5在索引位置为4的 和 33不能相邻的数字
if (string.indexOf("5") != 4 && string.indexOf("33") < 0) {
l.add(string);
}
}
return l;
}
public static void main(String args[]) {
String arr[] = { "1", "2", "3", "3", "5", "6" };
ArrangeTest ts = new ArrangeTest();
ts.genernateData(arr, 0, arr.length - 1);
ArrayList l = ts.filterNum();
for (int i = 0; i < l.size(); i++) {
System.out.println(l.get(i));
}
System.out.println("总个数====" + l.size());
}
}
分享到:
相关推荐
总结来说,解决排列组合问题需要掌握一系列的方法和技巧。例如,相邻问题可以采用捆绑法,将相邻的元素视为一个整体进行排列;相离问题则可以使用插空法,先排列不受位置限制的元素,再将相离的元素插入空位;对于定...
回溯算法是一种常用的算法,用于解决排列组合问题。该算法的基本思想是,通过递归地选择元素,并且在每一步骤中,检查当前选择的元素是否满足某些约束条件。如果满足条件,则继续选择下一个元素;否则,回溯到上一...
2. **标准模板库(STL)**:C++的STL提供了多种容器(如vector、deque、set等)和算法(如sort、next_permutation等),它们在解决排列组合问题时非常有用。例如,`std::next_permutation`可以生成序列的所有下一个...
总结来说,这两段Java代码展示了如何用回溯法解决排列组合问题。对于有重复元素的排列,需要额外的逻辑来避免重复;而对于无重复元素的排列,可以直接进行全排列的生成。理解这些算法对于提升编程技能和解决实际问题...
以上是排列组合21种模型的基本解析,每种模型都有其适用的情况和解题技巧,理解和掌握这些模型能够有效提高解决排列组合问题的能力。在实际应用中,需要根据题目具体条件灵活选择和组合使用这些模型。
总结来说,“插入算法”是解决排列组合问题的一种有效方法,它通过递归和回溯实现了对所有可能排列的生成。在实际编程中,这种算法不仅适用于排列问题,也可以在其他需要穷举所有可能解的问题中发挥作用,如密码学、...
在解决排列组合问题时,递归算法能够清晰地表达问题的结构。然而,随着`M`值的增大,单机计算所有排列组合变得越来越困难,因为中间结果的数量会迅速增长。例如,当`M=14`时,中间结果的数量就已经超过了1亿,这很...
在编程领域,排列组合是算法设计中的一个重要概念,它涉及到如何有效地生成所有可能的序列或组合作为问题的解决方案。本篇文章将详细讲解如何在Qt C++环境中实现排列组合的算法。 Qt是一个跨平台的C++图形用户界面...
高中数学讲义微专题81所涉及的主题为排列组合,核心概念是通过寻找合适的问题模型和等价转化来巧妙解决排列组合问题。排列组合是高中数学的一个重要分支,涉及到计数原理、组合数学以及概率论的基础知识。 例题分析...
这个例子展示了如何使用C++和递归来解决排列组合问题,尤其是针对数字相加得到指定和的情况。在实际编程中,可能需要对代码进行优化,例如使用更高效的数据结构或算法,以处理更大的数据集。同时,对于大型数据集,...
排列组合问题的算法设计是指如何高效地生成所有可能的排列或组合。今天,我们将讨论基于C语言的排列组合算法实现。 一、全排列算法 全排列算法是指生成所有可能的排列的算法。常见的全排列算法有递归算法、分治...
掌握上述策略和方法,考生不仅能够在高考数学中解决排列组合问题,而且在解决日常生活中的相关问题时也能运用这些知识。在备考过程中,不断实践和应用这些策略,可以提高解题的灵活性和准确性。
在C#编程中,排列组合算法是解决许多数学和计算机科学问题的基础,特别是在处理数据排序、统计计算以及算法设计时。本实例详细介绍了如何利用C#实现这两种基本的算法:排列(Permutation)和组合(Combination)。...
解决排列组合问题时,通常需要根据问题的性质选择直接法或间接法。对于复杂的排列问题,有时需要采用捆绑法(将相邻元素视为一个单元处理)或插空法(在其他元素之间插入所需元素)。 举例来说,如果五名学生报名...
在解决实际问题时,排列组合经常被应用于概率论、统计学、计算机科学等多个领域。 首先,我们需要了解排列的基本概念。若从n个不同元素中取出m(m≤n)个元素来排列,形成一个有序序列,这样的序列称为排列。排列的...
总结来说,“Combinations Calculator”是解决排列组合问题的强大工具,结合配套的参考材料,无论是学习还是工作,都能为用户带来极大的便利。了解和掌握排列组合的概念及其计算方法,对于理解和应用概率论、统计学...
在解决排列组合问题时,通常会使用加法原理和乘法原理。加法原理指出,如果事件A和事件B互斥,即A发生和B发生不能同时发生,那么事件A或事件B发生的总数就是A和B各自发生的次数之和。乘法原理指出,如果事件A的发生...
在解决排列组合问题时,我们通常会遇到一些常用技巧和公式,例如排列的性质:P(n,n) = n!,组合的二项式定理:C(n,k) + C(n,k-1) = C(n+1,k),以及组合的递推关系:C(n+1,m) = C(n,m) + C(n,m-1)。此外,还有鸽巢...
在解决排列组合问题时,常常会遇到一些策略,如特殊元素和特殊位置优先策略。例如,如果一个任务有特定的先决条件,如某个元素必须位于首位或末位,我们应优先处理这些特殊条件,然后对剩余的元素进行排列或组合。在...
高考数学中解排列组合问题PPT课件 排列组合问题是数学中一个重要的概念,它是数学领域中研究对象的排列和组合的方法和规律...合理分类和准确分步策略、元素相同问题隔板策略和转化法都是解决排列组合问题的重要方法。