zoukankan      html  css  js  c++  java
  • 竞赛题笔记(一):凑算式

    这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

    比如:
    6+8/3+952/714 就是一种解法,
    5+3/1+972/486 是另一种解法。

    这个算式一共有多少种解法? 

    Python解法1,普通递归版全排列:

    def connect_int(i1,i2,i3):
        return  int(str(i1)+str(i2)+str(i3))
    
    def dfs(nums):
        if len(nums)==9:
            if nums[0]+nums[1]/nums[2]+connect_int(nums[3],nums[4],nums[5])/connect_int(nums[6],nums[7],nums[8])==10:
                global count
                count+=1
                print(nums)
            return 
        
        for i in range(1,10):
            print(nums)
            nums.append(i)
            print(nums)
            dfs(nums)
            nums.pop()
    
    count=0
    alist=[]
    dfs(alist)
    
    print(count)

    解法1分析,这种用递归一个一个试所有全排列可能性的方法是十分低效的。

    备注,可以利用sys.setrecursionlimit(3000)修改递归深度

    Python解法2,优化版全排列:

    import copy
    
    def perm(n):
        data=[]
        
        if n==1:
            data.append([1])
        else:
            #m为n-1层data数据中的一项,存储了n-1位的全排列
            for m in perm(n-1):
                for j in range(len(m)+1):
                    k=copy.copy(m)
                    k.insert(j,n)
                    data.append(k)
        return data
    
    def connect_int(i1,i2,i3):
        return  int(str(i1)+str(i2)+str(i3))
    count
    =0 for nums in perm(9): if nums[0]+nums[1]/nums[2]+connect_int(nums[3],nums[4],nums[5])/connect_int(nums[6],nums[7],nums[8])==10: count+=1 print(nums) print(count)

    解法2分析,优化后的全排列只需要递归9次,其余交给列表来做,其实insert方法对性能影响也不小,每次插入后需要重新移动元素,但比解法1高效。

    备注:有时间还需要再分析下解法1为什么非常低效

    可以直接留言交流问题或想法,每天都会看
  • 相关阅读:
    Objective-C中#define的常见用法
    OpenGL ES为缓存提供数据的7个步骤
    绕指定点旋转算法
    矩阵平移旋转缩放公式
    矩阵和向量的乘法顺序
    干货集合
    RGB颜色空间与YCbCr颜色空间的互转
    UINavi中push控制器的时候隐藏TabBar
    CZLayer的阴影
    CALayer初认识
  • 原文地址:https://www.cnblogs.com/shitianfang/p/12383585.html
Copyright © 2011-2022 走看看