阿里巴巴和蘑菇街的笔试题,原题是这样的:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
将这12个人从1到12编号,只要确定矮的那排,后面一排也就确定了,因为是有序的。
然后第一个位置只能是1(同样12也只能在第二排的最后);
第二个位置只能是2或者3,如果是4的话,2,3必为上面一排的第一和第二个位置,3比4小了,所以不行。
同理,第三个位置只能是3,4,5,第四个位置为4,5,6,7.
以此类推,可以画出一个巨大的树,要注意后面的不能比前面的小,一共6层,最后一层就是最后的答案。
依据这个关系,写出一个模拟的程序来模拟这个过程,(最蠢的办法)
上代码看看
#include<stdio.h>
int a[6][1000];//开6个数组保存树每层的节点
int main()
{
a[0][0]=1;//第一层只有 "1"
int i,j=0,flag[6],k,l;//flag保存每层节点数目
flag[0]=1;
for(i=1;i<=5;i++)
{
for(k=0;a[i-1][k]!=0;k++)//遍历上一层节点
{
for(l=i+1;l<=2*i+1;l++)//这层可以考虑的几个数
{
if(a[i-1][k]<l)//保证按从矮到高
{
a[i][j]=l;//保存这层的节点
j++; //计数
}
}
}
flag[i]=j;
j=0;
}
for(i=0;i<6;i++)
{
printf("第%d层节点数目:%d\n",i+1,flag[i]);
}
return 1;
}