题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
现在小学的数学题目也不是那么好玩的。 看看这个寒假作业:
□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
每个方块代表 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
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
深度搜索+剪枝
将这12个空看为b[1]-----b[12],在1到13中选12个数填空
当遇到不满足条件的情况时,直接返回,不用再考虑剩下几个空填什么
ans = 0
b =[0]*15#填空
vis = [0]*15#记录这个数字是否用过
def dfs(num):
global ans
if num == 13:#因为是num+1之后才能到这,所以num的判断条件每次是填完空之后的数字
if b[10] == b[11]*b[12]:
ans+=1
return
if num==4 and b[1]+b[2] != b[3]: return
if num==7 and b[4]-b[5] != b[6]: return
if num==10 and b[7]*b[8] != b[9]: return
for i in range(1,14):#全排列
if vis[i]==0 :#当这个数字没用过时
b[num]=i#把这个数字放到b[num]的空中
vis[i]=1#将这个数字记为用过
dfs(num+1)#dfs寻找下个空,开始回溯至满足num==13的条件,中途不满足条件时直接开始下一种情况
vis[i]=0#将记号清0
dfs(1)
print(ans)
需要注意的是在代码17行, dfs(num+1)会不断进行递归,如果条件一直满足,则会return ans,再将vis数组重新清0之后开始下一个dfs(即b[num]=2)