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