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

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

         个高矮不同的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值