蓝桥杯-寒假作业-Python(详细解读)

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

现在小学的数学题目也不是那么好玩的。 看看这个寒假作业:

    □ + □ = □
    □ - □ = □
    □ × □ = □
    □ ÷ □ = □

每个方块代表 1~13 中的某一个数字,但不能重复。

比如:

  6  + 7 = 13
  9  - 8 = 1
  3  * 4 = 12
  10 / 2 = 5

以及:

  7  + 6 = 13
  9  - 8 = 1
  3  * 4 = 12
  10 / 2 = 5

就算两种解法。(加法,乘法交换律后算不同的方案)

你一共找到了多少种方案?

算法思想:主要是使用dfs去遍历所有的答案吧,不过可以确定一些优先级,来加快运算,比如式子中总共有四个要满足的,你必须把所有都满足了才行,所以如果第一个或第二个都不满足,就不用再往后面继续走了,先给出具体的代码实现

nums=[1,2,3,4,5,6,7,8,9,10,11,12,13]
#nums为具体可以选择的数字
count=0
#记录满足所有条件的正确答案数量

def dfs(nums,temp):
    global count
    if len(temp)==3:
        #如果长度为3代表就是temp内存储了三个数了,进行判断是否满足条件
        if temp[0]+temp[1]!=temp[2]:
            #如果不满足条件就返回,以此类推
            return
    elif len(temp)==6:
        if temp[3]-temp[4]!=temp[5]:
            return
    elif len(temp)==9:
        if temp[6]*temp[7]!=temp[8]:
            return
    elif len(temp)==12:
        if temp[9]/temp[10]!=temp[11]:
            return
        else:
            #满足了所有的条件就使得count+=1
            count+=1
            return

    for i in nums:
        #不断的遍历数组,从数组里取出来数,当取到了最后这个值,还没有取到,代表这个节点走不通了
        #就自动结束了这边的节点,跳到了上一个节点继续执行
        new_nums=nums.copy()
        #这里一定要做一个深拷贝,为了就是防止叶子节点,使用num时,把里面的节点值直接删了
        new_nums.remove(i)   
        #移除选过的值
        new_temp=temp+[i]
        #同理,这边也是不能直接贸然的直接append,因为append是直接改变原列表的,这样就乱套了       
        #如果没用,这边自然就会舍弃这个节点,跟上面的new_nums异曲同工
        dfs(new_nums,new_temp)
        
dfs(nums,[])
print(count)

算法内部详解:

  • 首先我们传进去一个空列表进去,里面的temp根据执行后面会变[1,2,3],new_nums=[4,5,6,7,8,9,10,11,12,13],
  • 而在这个时候满足了len(temp)=3了就会开始去判断,是否满足条件,而这边刚好我们1+2=3,所以继续往下走,可以继续快乐加加,
  • 而这边到了len(temp)=6时,我们的temp=[1,2,3,4,5,6],聪明的孩子一眼就看出来,哎呀这个4-5!=6的嘞,
  • 所以这里就会返回,删除了该子节点,返回到了上一个节点,也就是第六个节点之处,然后继续执行里面的内部循环,
  • 我们就可以看到了temp=[1,2,3,4,5,7],然后布拉布拉,发现4-5他丫的是一个负值呀,肯定不是我第6层的原因,所以内部循环就一直转,直到循环都执行完了,
  • 发现不对劲了,可能是第五层的原因,这个时候temp=[1,2,3,4,6]了,然后len(temp)=5,没有到6,继续执行循环,加入一个值temp就变成了[1,2,3,4,6,5],
  • 整体就是这样的一个执行流程,直到这一层都找完了,还没有就会返回上一层去找原因,这也就是dfs的思想所在了

你可能感兴趣的:(蓝桥杯,python)