zoukankan      html  css  js  c++  java
  • 竞赛题笔记(二):剪邮票

    有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)
    可以直接留言交流问题或想法,每天都会看
  • 相关阅读:
    应用部署架构演进【转载】
    TiDB 学习笔记一(运维管理)
    c++ strcmp函数
    C++ sort()函数
    C++ 遍历set的三种方式
    nvcc fatal : '--ptxas-options=-v': expected a number
    PAT A1039 Vector的使用
    C++ set
    C++ int与string互转换
    C++%f和%lf的区别
  • 原文地址:https://www.cnblogs.com/shitianfang/p/12405839.html
Copyright © 2011-2022 走看看