竞赛题笔记(二):剪邮票

有12张连在一起的12生肖的邮票。

现在你要从中剪下5张来,要求必须是连着的。

请你计算,一共有多少种不同的剪取方法。

用了奇怪的伪函数式编程把这道题做出来了,一开始深搜里嵌套了一个深搜,运算速度极其慢,最后用了官方库的排列组合才解决掉,有时间需要看一看官方库的全排列是怎么写的

def is_connect(path):
    pathed=[]

    def dfs(p,path):
        nonlocal pathed
        for d in [(0,1),(1,0),(-1,0),(0,-1)]:
            npx=p[0]+d[0]
            npy=p[1]+d[1]
            if npx >=0 and npx<3 and npy>=0 and npy<4:
                
                if (npx,npy) in path:
                    if (npx,npy) not in pathed:
                        pathed.append((npx,npy))
                        dfs((npx,npy),path)
                             
    for p in path:
        dfs(p,path)
        break
    
    if len(pathed)==len(path):
        return True
    else:
        return False
        
import copy
import itertools
stamp=[[0,1,2,3],
       [4,5,6,7],
       [8,9,10,11]]

last_path=[]
nums=0

#注意第一个for在外层
position=[(x,y)for x in range(3for y in range(4)]

for perm in itertools.combinations(range(12),5):
    #一维转二维
    elem_p=[(e//4,e%4for e in perm]
 
    if is_connect(elem_p):
        last_path.append(elem_p)
        nums+=1
        print(nums)
可以直接留言交流问题或想法,每天都会看
原文地址:https://www.cnblogs.com/shitianfang/p/12405839.html