0
点赞
收藏
分享

微信扫一扫

蓝桥杯趣味算式-回溯法-python题解

ZSACH 2022-03-11 阅读 56

趣味算式

匪警请拨110,即使手机欠费也可拨通!

为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!

某批警察叔叔正在进行智力训练:

1 2 3 4 5 6 7 8 9 = 110;

请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。

请你利用计算机的优势,帮助警察叔叔快速找到所有答案。

每个答案占一行。形如:

12+34+56+7-8+9
  123+4+5+67-89
  …

已知的两个答案可以输出,但不计分。

各个答案的前后顺序不重要。

op=['' for i in range(9)]
a=[]
for i in range(9):
    a.append(i+1)

def dfs(s,preadd,i):
    global op
    if i==9:
        if s==110:
            print(a[0],end='')
            for j in range(1,9):
                if op[j]!='':
                    print(op[j],end='')
                print(a[j],end='')
            print()
        return

    
    op[i]=''
    s-=preadd
    tmp=0
    if preadd>0:
        tmp=preadd*10+a[i]
    if preadd<0:
        tmp=preadd*10-a[i]
    s+=tmp
    dfs(s,tmp,i+1)
    s-=tmp
    s+=preadd

    op[i]='+'
    s+=a[i]
    dfs(s,a[i],i+1)
    s-=a[i]
    
    op[i]='-'
    s-=a[i]
    dfs(s,-a[i],i+1)
    s+=a[i]



dfs(a[0],a[0],1)

举报

相关推荐

0 条评论