回溯法解决阿里面试题之12人排队

来源:互联网 发布:最好的阅读软件 编辑:程序博客网 时间:2024/06/07 10:28

        下面是一道阿里的面试题:

         个高矮不同的12个人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

         网友给出的解决方案,大多是通过Catalan数来解决的,有万能解题法的回溯法当然也可以解决这个问题,下面是我用回溯法来解决这个问题的java代码:


package com.soft;import java.util.Arrays;/** * 张猛  * 2014年8月20日  * description: * 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?  */public class LineUp {// 不变信息static int n;// 动态改变信息static int front;// 记录前排的数目static int back;// 记录后排的数目static int count;// 记录解数目/** * @author zhangmeng *@param i 表示第i层,此时决定第i+1个人的位置 */private static void trackback(int i) { // 更新frontif (i < n) {// 如果满足约束条件,搜索左子树if (front < 6 && front >= back) {// 搜索左子树front++;LineUp.trackback(i + 1);//清理现场front--;}// 如果 满足上界函数,搜索右子树if (back < 6 && front >back) {// 更新cxback++;trackback(i + 1);//清理现场back--;}}else{//处理第n层count++;return;}}public static int LineUpCount() {LineUp.n = 12;LineUp.back = 0;LineUp.front = 0;LineUp.count = 0;trackback(0);return LineUp.count;}public static void main(String[] args) { System.out.print(LineUp.LineUpCount());}}

运行结果:132

分析:这是一个子集树问题,这里的子集指的是站在前排人的集合。

            约束条件:front < 6 && front >= back

            限界条件:back < 6 && front >back

0 0
原创粉丝点击