`
shuishou119800
  • 浏览: 7888 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

带条件的排列组合算法分析

阅读更多

算法说明:

用1、2、2、3、4、5这六个数字打印出所有不同的排列,如:512234、412345等。要求:"4"不能在第三位,"3"与"5"不能相连

  

算法代码:

public class PermutationAlgo {
  private int count = 0;
  
  public void calculate(){
    String eleStr = "122345";
    depthSearch(eleStr, "");
    System.out.println("符合条件的总结果数为:"+count+"条");
  }
  
  /**
   * @param eleStr - 待分配字符组成的串
   * @param rstStr - 已分配字符组成的串
   */
  public void depthSearch(String eleStr, String rstStr) {
    if (eleStr.length() == 0) {
      count++;
      System.out.println(rstStr);
      return;
    }
    for (int i = 0; i < eleStr.length(); i++) {
      String currEle = eleStr.substring(i, i + 1); //取出当前位的值
      if (rstStr.length() == 2 && "4".equals(currEle)) continue; //剪掉第三位为4的分支
      if (rstStr.endsWith("3") && "5".equals(currEle)) continue; //剪掉"35"相连的分支
      if (rstStr.endsWith("5") && "3".equals(currEle)) continue; //剪掉"53"相连的分支
      if (eleStr.substring(0, i).indexOf(currEle) != -1) continue; //剪掉同一位上字符重复的分支(此题即剪掉重复的2)
      depthSearch(eleStr.substring(0, i) + eleStr.substring(i + 1), rstStr + currEle); //用剩余的合法串继续递归
    }
  }
  
  public static void main(String[] args) {
    new PermutationAlgo().calculate();
  }
}

 

 

算法分析:

因为是排列组合所以用递归

因为有条件所以递归时要剪枝

可用公式算出合法的排列数,以验证结果:

 

  (A66 - A55 - 2·A55 + 2·C13·A33)/2 = 198

 

  第一项为全排列的数量

  第二项为"4"在第三位的数量

  第三项为"3"与"5"相连的数量

  第四项加回二三项重复减去的数量

  因为排列中有两个相同的字符"2",且在各个位置出现的概率相同,故需将整个结果除2修正

 

此题本身并不难,因为在论坛上看到很多人对排列组合的算法缺乏一般的解题思路,因而贴出,希望能给大家带来帮助。

分享到:
评论
2 楼 王书兴 2010-12-29  
似乎有问题吧 ,字符串中的数字是按顺序取的,并没有进行排列啊
1 楼 yangguo 2010-09-26  
引用
  if (eleStr.substring(0, i).indexOf(currEle) != -1) continue; //剪掉同一位上字符重复的分支(此题即剪掉重复的2) 


为什么这样能剪掉重复?

相关推荐

    基于c语言的排列组合算法

    在这个“基于C语言的排列组合算法”中,我们将深入探讨这两个概念以及如何使用C语言来实现它们。 排列是有限集合中的元素的一种有顺序的排列方式。在C语言中,我们可以使用递归方法来实现排列算法。首先,我们需要...

    算法 排列组合生成器 后端

    这个项目为开发者提供了一个学习和实践排列组合算法、SpringBoot框架以及H2数据库整合的绝佳案例。它不仅展示了如何在后端实现复杂的算法,还涵盖了数据库管理和API设计等多个核心技能。对于希望提升后端开发能力的...

    排列组合生成算法

    - 输入排列组合算法的代码,确保正确包含必要的头文件,如`#include &lt;iostream&gt;`,`#include &lt;algorithm&gt;`等。 - 使用`std::cout`打印结果,或者将结果保存到文件中。 - 编译并运行程序,观察输出结果。 4. **...

    排列组合有重复

    排列组合有重复 本资源主要讨论排列组合问题,特别是具有重复元素的排列组合...本资源的内容丰富、详细,涵盖了排列组合问题的定义、回溯算法的应用、实验设计和实现、实验结果和分析等方面的内容,供读者学习和参考。

    JS实现的排列组合算法示例

    JavaScript中的排列组合算法是指在编程过程中,根据数学中的排列组合原理,通过编写代码来计算给定数集中选取特定数量元素的所有可能组合情况。这一概念在计算机科学和软件开发中十分常见,尤其是在涉及概率统计、...

    易语言数字排列组合源码

    排列组合是组合数学中的基本概念,广泛应用于各种算法设计和数据分析中。 排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的方法数,记为P(n,m)。组合则是指从n个不同元素中不考虑顺序取出m个...

    PHP实现的简单排列组合算法应用示例

    在编程领域,排列组合算法是解决许多问题的基础,特别是在数据处理、统计分析以及优化问题中。PHP作为一种广泛使用的服务器端脚本语言,同样支持实现这些算法。本文将详细探讨如何使用PHP实现简单的排列组合算法,并...

    疯狂排列组合

    在数学领域,排列组合是概率论、统计学和计算机科学中的基础概念,广泛应用于数据分析、算法设计以及问题求解等多个场景。该软件通过友好的用户界面,简化了这些复杂的计算过程,使得无论是初学者还是专业人士都能...

    概率排列组合全章教案

    在计算机科学中,排列组合用于算法设计,如搜索和排序算法,以及组合优化问题,如旅行商问题。 本章教案会详细讲解排列组合的性质和推导过程,包括对称性、乘法原理、加法原理、帕斯卡定律(二项式定理)等。此外,...

    易语言数字排列组合学习源码

    通过分析和学习这份源码,我们可以掌握如何在易语言环境下实现排列组合的计算,同时也能锻炼解决问题的能力和编程思维。此外,对于想要进一步提升的开发者,可以尝试将代码扩展到更大的数字范围,或者优化算法以提高...

    易语言递归法取排列组合例程

    通过学习和理解这个例程,你可以掌握易语言中的递归编程技巧,同时加深对排列组合算法的理解。这种知识不仅可以应用于易语言,还可以迁移到其他编程语言,因为递归法是通用的算法设计方法。对于想要提升编程能力的人...

    MM排列组合,Delphi示例源码..rar

    通过分析和学习这些代码,你可以更好地理解如何在Delphi中实现排列组合算法,这对于提升你的算法设计和编程能力大有裨益。 在实际应用中,你可以根据需求调整这个算法,比如添加限制条件以生成特定的排列,或者优化...

    经典 算法思想 穷举法 高精度 动态规划 回溯 贪心 排列组合 排序

    本资源包聚焦于几种常见的算法策略,包括穷举法、高精度计算、动态规划、回溯、贪心算法、排列组合以及排序。下面将逐一详细阐述这些算法思想及其应用。 1. **穷举法**:穷举法,也称为全搜索法,是一种通过尝试...

    排列组合demo

    9crimes这个文件名可能是这个项目中的一个示例或者测试用例,可能包含了一组特定的数据,用于检验排列组合算法的正确性。通常,测试用例会包括各种边界条件,如空集、只有一个元素的集合、所有元素都相同的集合等,...

    2020届高考数学二轮复习专题4统计与概率排列与组合算法初步复数第1讲排列组合与二项式定理练习理

    排列组合是高中数学中的核心知识点,它涉及到统计与概率的学习,同时也与算法初步和复数有一定关联。在高考数学的复习中,这部分内容是必不可少的。以下是对排列、组合与二项式定理的详细解释: 1. **排列**:排列...

    组合算法|C++实现

    本文介绍了一种基于C++语言实现的组合算法,通过对关键函数的详细分析,读者可以更好地理解组合算法的工作原理及其在编程实践中的应用。这种算法不仅适用于数学计算,还可以广泛应用于数据处理、信息检索等多个领域...

    易语言源码排列组合模块(M选N)源码.rar

    2. 修改源代码以实现不同限制条件下的排列组合,比如限制元素重复选取。 3. 实现其他算法,如回溯法或鸽巢原理,对比效率和效果。 4. 设计测试用例,验证代码的正确性。 5. 将此模块整合到实际项目中,如数据分析...

    PaiLieZuHe.zip_排列组合

    在实际应用中,排列组合算法常用于解决各种问题,如密码学中的密钥生成、生物信息学中的基因序列分析、比赛的赛程安排等。掌握这种算法对于提高编程解决问题的能力至关重要。 在Java中实现排列组合,需要对递归、...

    易语言排列组合模拟工具

    在计算机科学和编程领域,排列组合是组合数学中的基本概念,广泛应用于数据分析、算法设计以及各种游戏设计中。本文将深入探讨易语言排列组合模拟工具,揭示其在游戏开发中的应用及其背后的数学原理。 易语言,作为...

    经典的组合算法

    本篇文章将深入解析一种经典排列组合算法的核心概念、实现逻辑及其应用场景,旨在为同行朋友们提供有价值的参考。 #### 一、算法背景及概念介绍 在给定的代码示例中,我们看到的是一个简单的组合生成器。它使用了...

Global site tag (gtag.js) - Google Analytics