火柴问题,请找出通过移动一根火柴棒(即移走一根火柴棒并把它放在不同的位置上)可以从这个数组成的所有数

在这里插入图片描述

火柴像这样组成0~9的数字, ,

现在你面前有一个由火柴棒组成的数字。
请找出通过移动一根火柴棒(即移走一根火柴棒并把它放在不同的位置上)可以从这个数组成的所有数。
但是,只应考虑上图中 0 到 9 所组成的数字,而不能用火柴棒代替减号等。

例如,从 16 开始恰好移动一根火柴棒,就可以组成三个不同的数字:10、19 和 75。
在这里插入图片描述

输入就是一个数字 s

长度1~10之间

在这里插入图片描述

将添加1,减少1,移动1的每个数字的每种情况组成一个字典。

data_dict = {
    "0": {
        "add_1": ["8"],
        "sub_1": [],
        "move_1": ["6", "9"],
    },
    "1": {
        "add_1": ["7"],
        "sub_1": [],
        "move_1": [],
    },
    "2": {
        "add_1": [],
        "sub_1": [],
        "move_1": ["3"],
    },
    "3": {
        "add_1": ["9"],
        "sub_1": [],
        "move_1": ["5"]
    },
    "4": {
        "add_1": [],
        "sub_1": [],
        "move_1": [],
    },
    "5": {
        "add_1": ["6", "9"],
        "sub_1": [],
        "move_1": ["3"],
    },
    "6": {
        "add_1": ["8"],
        "sub_1": ["5"],
        "move_1": ["9"]
    },
    "7": {
        "add_1": [],
        "sub_1": ["1"],
        "move_1": [],
    },
    "8": {
        "add_1": [],
        "sub_1": ["6", "9", "0"],
        "move_1": [],
    },
    "9": {
        "add_1": ["8"],
        "sub_1": ["3", "5"],
        "move_1": ["0", "6"],
    },
}

实现了一个初步版本的算法如下:


data_dict = {
    "0": {
        "add_1": ["8"],
        "sub_1": [],
        "move_1": ["6", "9"],
    },
    "1": {
        "add_1": ["7"],
        "sub_1": [],
        "move_1": [],
    },
    "2": {
        "add_1": [],
        "sub_1": [],
        "move_1": ["3"],
    },
    "3": {
        "add_1": ["9"],
        "sub_1": [],
        "move_1": ["5", "2"]
    },
    "4": {
        "add_1": [],
        "sub_1": [],
        "move_1": [],
    },
    "5": {
        "add_1": ["6", "9"],
        "sub_1": [],
        "move_1": ["3"],
    },
    "6": {
        "add_1": ["8"],
        "sub_1": ["5"],
        "move_1": ["9", "0"]
    },
    "7": {
        "add_1": [],
        "sub_1": ["1"],
        "move_1": [],
    },
    "8": {
        "add_1": [],
        "sub_1": ["6", "9", "0"],
        "move_1": [],
    },
    "9": {
        "add_1": ["8"],
        "sub_1": ["3", "5"],
        "move_1": ["0", "6"],
    },
}


def get_move1_results(data_input):
    data_output = []
    for i in data_input:
        move_arr = data_dict.get(i).get("move_1")
        for mi in move_arr:
            data_output.append(data_input.replace(i, mi))
    if len(data_input) > 0:
        return data_output


def get_add1_sub1_results(data_input):
    data_output = []
    for i in range(len(data_input)):
        ki = data_input[i]
        add_arr = data_dict.get(ki).get("add_1")
        if len(add_arr) == 0:
            continue
        for j in range(len(data_input)):
            if i == j:
                continue
            kj = data_input[j]
            sub_arr = data_dict.get(kj).get("sub_1")
            if len(sub_arr) == 0:
                continue
            for addv in add_arr:
                for subv in sub_arr:
                    tmp = list(data_input)
                    tmp[i] = addv
                    tmp[j] = subv
                    tmp = "".join(tmp)
                    # print("tmp", tmp)
                    # tmp = tmp.replace(i, addv)
                    # print("tmp", tmp)
                    # tmp = tmp.replace(j, subv)
                    # print("tmp", tmp)
                    data_output.append(tmp)

    if len(data_input) > 0:
        return data_output


def alg(data_input):
    data_output = []
    move1 = get_move1_results(data_input)
    if move1:
        data_output.extend(move1)
    add1_sub1 = get_add1_sub1_results(data_input)
    if add1_sub1:
        data_output.extend(add1_sub1)

    if len(data_output) > 0:
        data_output = list(set(data_output))
        data_output.sort()
        return data_output


if __name__ == '__main__':
    test_data = [
        "16",
        "888",
        "01234567",
    ]
    for tt in test_data:
        print(alg(tt))

三个测试用例都能通过,但是更多的示例需要进一步测试:
在这里插入图片描述

上面的代码可能不符合刷题网站的输出要求,改写如下:

data_dict = {
    "0": {
        "add_1": ["8"],
        "sub_1": [],
        "move_1": ["6", "9"],
    },
    "1": {
        "add_1": ["7"],
        "sub_1": [],
        "move_1": [],
    },
    "2": {
        "add_1": [],
        "sub_1": [],
        "move_1": ["3"],
    },
    "3": {
        "add_1": ["9"],
        "sub_1": [],
        "move_1": ["5", "2"]
    },
    "4": {
        "add_1": [],
        "sub_1": [],
        "move_1": [],
    },
    "5": {
        "add_1": ["6", "9"],
        "sub_1": [],
        "move_1": ["3"],
    },
    "6": {
        "add_1": ["8"],
        "sub_1": ["5"],
        "move_1": ["9", "0"]
    },
    "7": {
        "add_1": [],
        "sub_1": ["1"],
        "move_1": [],
    },
    "8": {
        "add_1": [],
        "sub_1": ["6", "9", "0"],
        "move_1": [],
    },
    "9": {
        "add_1": ["8"],
        "sub_1": ["3", "5"],
        "move_1": ["0", "6"],
    },
}


def get_move1_results(data_input):
    data_output = []
    for i in data_input:
        move_arr = data_dict.get(i).get("move_1")
        for mi in move_arr:
            data_output.append(data_input.replace(i, mi))
    if len(data_input) > 0:
        return data_output


def get_add1_sub1_results(data_input):
    data_output = []
    for i in range(len(data_input)):
        ki = data_input[i]
        add_arr = data_dict.get(ki).get("add_1")
        if len(add_arr) == 0:
            continue
        for j in range(len(data_input)):
            if i == j:
                continue
            kj = data_input[j]
            sub_arr = data_dict.get(kj).get("sub_1")
            if len(sub_arr) == 0:
                continue
            for addv in add_arr:
                for subv in sub_arr:
                    tmp = list(data_input)
                    tmp[i] = addv
                    tmp[j] = subv
                    tmp = "".join(tmp)
                    # print("tmp", tmp)
                    # tmp = tmp.replace(i, addv)
                    # print("tmp", tmp)
                    # tmp = tmp.replace(j, subv)
                    # print("tmp", tmp)
                    data_output.append(tmp)

    if len(data_input) > 0:
        return data_output


def alg(data_input):
    data_output = []
    move1 = get_move1_results(data_input)
    if move1:
        data_output.extend(move1)
    add1_sub1 = get_add1_sub1_results(data_input)
    if add1_sub1:
        data_output.extend(add1_sub1)

    if len(data_output) > 0:
        data_output = list(set(data_output))
        data_output.sort()
        return data_output


if __name__ == '__main__':
    data_input = input()
    data_output = alg(data_input)
    if data_output:
        for v in data_output:
            print(v)
    else:
        print("none")

  • 17
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python私教

创业不易,请打赏支持我一点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值