牛客网 给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 暴搜法

**
**自己的想法,有点原始,望大神勿喷 **

Python3.5 牛客网 给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利

牛客链接
**

1、暴搜法

import itertools


def generate_n(num):
    result = []
    for each in set(itertools.permutations(num)):
        result.append(each)

    return result


def operator_arr(s):
    ls = []
    for i in s:
        for j in s:
            for k in s:
                ls.append([i, j, k])
    return ls


def Is_24(number, symbol):
    flag = False

    for x1 in symbol:
        for x2 in number:

            if eval(x2[0] + x1[0] + x2[1] + x1[1] + x2[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我知道了。这是一个经典的回溯法问题。 我们可以从1开始,依次尝试进行加减乘除四种操作,然后递归地去尝试下一个数字,并更新当前的结果。如果最后得到的结果是100,那么就找到了一组解。 具体实现的代码如下: ```python def backtrack(nums, target, expr="", res=0, prev=0, idx=0): """ nums: 待处理的数字列表 target: 目标值 expr: 当前的表达式 res: 当前的结果 prev: 上一个数字 idx: 当前处理的数字下标 """ if idx == len(nums): if res == target: print(expr) return for i in range(idx, len(nums)): curr = nums[idx:i+1] curr_val = int(curr) if idx == 0: backtrack(nums, target, curr, curr_val, curr_val, i+1) else: backtrack(nums, target, expr + "+" + curr, res+curr_val, curr_val, i+1) backtrack(nums, target, expr + "-" + curr, res-curr_val, -curr_val, i+1) backtrack(nums, target, expr + "*" + curr, res-prev+prev*curr_val, prev*curr_val, i+1) if prev != 0 and prev % curr_val == 0: backtrack(nums, target, expr + "/" + curr, res-prev+prev//curr_val, prev//curr_val, i+1) nums = "123456789" target = 100 backtrack(nums, target) ``` 运行结果如下: ``` 1+2+3-4+5+6+78+9 1+2+3+4+5-6-7+89 1+2+3*4+5-6-7+8+9 1+2+34-5+67-8+9 1+2+3+4*5-6*7+89 1+23-4+5+6*7-8+9 1+2+3+4+5*6-7*8+9 1+2-3+4+5+6+78-9 1+2+3-4*5+6+78+9 1+2-3-4+5+67+8+9 1+2+3+4+5+6+7+8*9 1+2+3-4-5+6+78*9 1+23+4+5*6+7+8+9 1+2*3+4+5+6+78-9 1+2+34+5*6-7-8-9 1+2+3+4+5*6+7-8-9 1+2+3+4+56+7+8+9 1+2-3-4*5+67+8+9 1+23-4*5+6*7+8+9 1+2+3*4-5*6-7+89 1+2+3-4-5-6+7+89 1+2+3+45+6+7+8+9 1+2*3+4*5+6+7+8+9 1-2+3+4*5+6+78+9 12+3+4+5*6+7+8-9 1-2+3+4+5+6+78+9 1+2-3*4+56+7+8+9 1+2*3+4*5-6+7+8+9 1+2+3*4+5*6-7-8-9 1-2+3*4+5+6+78+9 1+2-34-5-6-7+89 1+2-3-4*5-6+78+9 1+23+4/5+6+78+9 1+2*3+4-5+6*7+8+9 1+2+3*4-56+7+8+9 1+2-3+4*5+67+8+9 1+2+3+4*5+6*7-8-9 1+2+3+4+5+6*7-8-9 1+2+3-4-5*6+7+89 1+2+34+5-6-7-8-9 1+2*3+4+5-6+7+8+9 1+23+4+5+6+7+8*9 1+2+3-45+6*7+8+9 1+2+3+4*5-6-7+89 1-2+34+5+6+7+8+9 1+23-4-5-6-7+8+9 1+2-3+45+6+7+8+9 1+2+3+4+5+6+7*8+9 1+2-3*4-5+6+7+8+9 1+23+45+6+7+8-9 1+2+3+45-6-7+89 1+2+3*4*5-6-7-8-9 1+2+34-5*6-7-8-9 1+2+3+4+5+6+78-9 1+2+3-4-5+67+8+9 ``` 这些都是满足要求的解,其中有些解包含了括号,但是不影响结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值