下面是一道阿里的面试题:
个高矮不同的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) {
// 更新front
if (i < n) {
// 如果满足约束条件,搜索左子树
if (front < 6 && front >= back) {
// 搜索左子树
front++;
LineUp.trackback(i + 1);
//清理现场
front--;
}
// 如果 满足上界函数,搜索右子树
if (back < 6 && front >back) {
// 更新cx
back++;
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