搭积木---蓝桥杯

求全排列,在用非递归的方法的时候,最烦人的一点就是缩进,特别是在数多的时候,今天在做搭积木的题的时候就是,当时没跑出来,我还以为是方法的问题,试了好多次,还是不行,最后才发现原来是缩进的错误。
下面展示出题目和方法
题目:

搭积木

小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。

搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

   0
  1 2
 3 4 5
6 7 8 9

   0
  3 1
 7 5 2
9 8 6 4    

请你计算这样的搭法一共有多少种?

请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

下面贴上代码:(非递归)

lit=[0,1,2,3,4,5,6,7,8,9]
sum=0
for a in lit:
    for b in lit:
        if a==b:
            continue
        for c in lit:
            if c in [a,b]:
                continue
            if (a>b and a>c):
                continue
            for d in lit:
                if d in [a,b,c]:
                    continue
                for e in lit:
                    if e in [a,b,c,d]:
                        continue
                    if (b>d and b>e):
                        continue
                    for f in lit:
                        if f in [a,b,c,d,e]:
                            continue
                        if (c>e and c>f):
                            continue
                        for g in lit:
                            if g in [a,b,c,d,e,f]:
                                continue
                            for h in lit:
                                if h in [a,b,c,d,e,f,g]:
                                    continue
                                if (d>g and d>h):
                                    continue
                                for i in lit:
                                    if i in [a,b,c,d,e,f,g,h]:
                                        continue
                                    if (e>h and e>i):
                                        continue
                                    for j in lit:
                                        if j in [a,b,c,d,e,f,g,h,i]:
                                            continue
                                        if (f>i and f>j):
                                            continue
                                        sum=sum+1
                                    
print(sum)

结果:

768

递归:


def permutation(lst):
    if len(lst)==0 or len(lst)==1:
        return [lst]
    result=[]
    for i in lst:
        temp_list=lst[:]     
        temp_list.remove(i)       
        temp=permutation(temp_list)
        for j in temp:
            j.insert(0,i)     
            result.append(j)
    return result

if __name__=="__main__":
    lst=[0,1,2,3,4,5,6,7,8,9]
    sum = 0
    temp_result=permutation(lst)  
    for lit2 in temp_result:
        if lit2[0]<lit2[1] and lit2[0]<lit2[2] and lit2[1]<lit2[3] and lit2[1]<lit2[4] and lit2[2]<lit2[4] and lit2[2]<lit2[5] and lit2[3]<lit2[6] and lit2[3]<lit2[7] and lit2[4]<lit2[7] and lit2[4]<lit2[8] and lit2[5]<lit2[8] and lit2[5]<lit2[9]:
            sum=sum+1
print(sum)

结果都是一样的,在这里有一个很低级的错误值的大家学习,就是在数比较多的情况,一定要注意缩进,有时候在这种情况又不会报错,但又不会出结果,贼烦人,还浪费时间。
这只是本人的一些方法,如有错误或者更好的方法还请多多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值