算法说明:
用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修正
此题本身并不难,因为在论坛上看到很多人对排列组合的算法缺乏一般的解题思路,因而贴出,希望能给大家带来帮助。
分享到:
相关推荐
本书是《组合数学》第3版的修订版,全书共分8章,分别是:排列与组合、递推关系与母函数、容斥原理与鸽巢原理、burnside引理与polya定理、区组设计、线性规划、编码简介、组合算法简介。丰富的实例及理论和实际相...
专题十:算法分析与设计 1.常用的算法设计方法: 1.1 迭代法 1.2 穷举搜索法 1.3 递推法 1.4 递归法 1.5 贪婪法 1.6 分治法 1.7 动态规划法 1.8 回溯法 算法基础部分: 算法是对特定问题求解步骤的一...
程序引入变量a、b、c、d、e、f,并让它们分别顺序取1至6的证书,在它们互不相同的条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。当这些变量取尽...
组合数学(排列与组合,鸽笼原理,容斥原理,递推,Fibonacci数列,Catalan数列,Stirling数,差分序列,生成函数,置换,Polya原理) 概率论(简单概率,条件概率,Bayes定理,期望值) 矩阵(矩阵的概念和运算...
1990 8 排列组合问题,二元关系, 1991 13 Chomsky形式语言分层理论 1991 14 图,最大强联通子图,最大单向联通子图 1992 13 谓词,永真式,合取范式,前束合取范式。 1992 14 代数系统二元关系,群 2004下 6~7 ...
这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上比原问题小 子问题可通过再次递归调用求解 子问题的解应能组合成整个问题的解 对于字符串的排列问题...
递回求解,通常用于需暴力找出所有排列组合,但又需排除掉某些不正确的组合时使用,通常会有三个主要部分: 递回函式的符合条件 当结果符合时,储存或输出答案,并跳离递回。 递回函式的参数 一定会有一个result用于...
在发现错误后,排列应由()完成 答:软件的开发者 软件工程的出现是由于 答:计算机软件的发展 下列哪个阶段不属于软件生存期的三大阶段 答:编码阶段 下列哪种方法不是度量效益的方法 答:算法模型古迹 需求分析是 ...
排列组合。 密码学; 递归和一厢情愿的想法; 最长回文子串算法。 第 3 课:正则表达式、其他语言和解释器 定义正则表达式的语言; 口译语言; 定义正则表达式匹配的字符串集; 其他语言。 第 4 课:通过搜索处理...
《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...
• 多条件组合查询资料 • 利用INDEX函数结合MATCH函数进行向左查找 • 实现根据学员成绩查询等级 • 确定工资单中最后一名员工的位置 • 根据工资表生成工资条 • 利用CHOOSE函数重新生成内存数组 • 利用查找函数...
23.29 上一排列组合prev_permutation 409 23.30 本章小结 411 第24章 数值算法 412 24.1 递增赋值iota 412 24.2 元素求和accumulate 413 24.3 两序列元素内积inner_product 414 24.4 部分元素求和...
23.29 上一排列组合prev_permutation 409 23.30 本章小结 411 第24章 数值算法 412 24.1 递增赋值iota 412 24.2 元素求和accumulate 413 24.3 两序列元素内积inner_product 414 24.4 部分元素求和...
23.29 上一排列组合prev_permutation 409 23.30 本章小结 411 第24章 数值算法 412 24.1 递增赋值iota 412 24.2 元素求和accumulate 413 24.3 两序列元素内积inner_product 414 24.4 部分元素求和...
4. 应用概率工具如Monte Carlo方法、算法的平均情况分析和散列法来解决问题。 程序设计基础(PF) PF1.基本程序设计结构[核心] PF2.算法和问题求解[核心] PF3. 基本的数据结构[核心] PF4. 递归[核心] PF5. 事件...
6.3.4 算符优先分析算法 6.3.5 优先函数 6.3.6 算符优先分析法的局限性 6.4 典型例题及解答 练习第7章 LR分析 7.1 LR分析概述 7.2 LR(0)分析 7.2.1 可归前缀和子前缀 7.2.2 识别活前缀的有限自动机 7.2.3 活前缀...
也无数学公式可寻,看来只能搜索(组合的生成算法),其实1这个约束条件也暗示我们本题搜索是有希望的,组合的生成可用简单的DFS来实现,既搜索这k个整数在原数列中的位置,由于组合不同于排列,与这k个数的排列顺序...