回溯法解决阿里面试题之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

    原文作者:回溯法
    原文地址: https://blog.csdn.net/u011824857/article/details/38794153
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞