Interview100-80 12人排队问题

题目

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

解法

假设12个人从矮到高依次从0到11进行编号,(i,j)表示一个人在排队中的位置,那么(0, 0)位置一定是0号(最矮的),然后放置1号,1号可以放在(0,1)或(1,0)的位置。如下:

  0 1 2 3 4 5
0 0 1
1

  0 1 2 3 4 5
0 0 
1 1

那么2号的位置会取绝与1号的位置,如果1号在(0,1),那么2号在第1排(0,2)或者第二排(1,0)都可以。但如果1号在(1,0)的位置,那么2号只能放到第一排(0,1),因为如果这时2号放置到第二排(1,1)时,那么3号将无处放置。

  0 1 2 3 4 5
0 0 1 // 2的位置可以有两个
1 2 
  0 1 2 3 4 5
0 0 1 2 
1 

  0 1 2 3 4 5
0 0 2
1 1 
  0 1 2 3 4 5
0 0 
1 1 2 // 3将无处放置

因此有如下规律:对于i号,如果第一排和第二排的人数一样的话,那么它只能放置到第2排,如果第一排的人数多于第二排时,那么他可以放置到第1排或者第2排。这样的话,可以使用递归进行求解,分别使用两个变量对第一排和第二排的人数进行计数。

staic total_num = 0;
LINE-UP(int firstcount, int secondcount, int num):
    if firstcount == num/2 or secondcount = num/2:
        total_num++;
        return;
    if firstcount == secondcount:
        LINE-UP(firstcount + 1, secondcount, num);
    else
        LINE-UP(firstcount + 1, secondcount, num);
        LINE-UP(firstcount, secondcount + 1, num);

TEST-FUNCTION():
    LINE-UP(0, 0, 12);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值