题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
现在小学的数学题目也不是那么好玩的。 看看这个寒假作业:
□ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □
每个方块代表 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的思想所在了