闲的蛋疼:用算法解移动一根火柴问题

本文介绍了使用算法解决移动一根火柴棍的问题,限制为标准数字变化,不支持数字间插入符号。通过分析每个字符在加、减、自身移动火柴后的可能形态,对原始等式进行变换,寻找新的等式。虽然对于某些问题(如14-1+1=3)算法无法得出正确答案,但可以通过调整字符变换规则来改进。此外,还提及了如何自动生成这类问题。
摘要由CSDN通过智能技术生成

最近一直看到诸如


的问题,闲的无聊,便写了段代码来自动解答这类问题。

初步只能支持标准的数字变化,即9可以变成3,5,6等,但是不能变成13因为一根火柴棍形成不了1(1需要两根火柴棍).另外数字间不能插入符号,例如132不能变成13-2,因为没有空间可以插入。

允许更为灵活的变换需要更多的代码,在此不过多深入思考了

思路如下:

1)首先求出每个字符“0~9 - +”增加一根火柴,减少一根火柴,自身移动一根火柴,所能形成的新的字符。

例如9,如果增加一根火柴,那么可以变成8,如果9在等式的最左边,也可以变成-9;如果减少一根火柴,那么可以变成5或者3,如果自身移动一根火柴,那么可以变成6.

2)解析问题串,譬如 3+6=3,解析为:

q = [
    Item("3",PositionType.FrontEmpty,Side.Left),
    Item("+",PositionType.Default,Side.Left),
    Item("6",PositionType.Default,Side.Left),
    Item("3",PositionType.Default,Side.Right)
]

3)对于已解析的q,对其进行如下变换。

    .1 对任一字符进行自身移动操作,对于新产生的q,计算其是否是等式,若是则输出答案。

    .2 对任一字符进行减少一根火柴操作,对于新产生的q,对其任一字符进行增加一根火柴操作,生成新的q1.对于q1,计算其是否是等式,若是则输出答案。

以下是完整的源码:

其中, 使用7位数组标定一个数字(1为有边,0位无边),大意如图:


class ActionType:
    Dec = 0 #将火柴移出
    Inc = 1 #将火柴移入
    SelfTrans = 2

class PositionType:
    Default = 0
    FrontEmpty = 1

class Side:
    Left = 0
    Right = 1

class Item:
    def __init__(self,value,positionType,side):
        self.value = value
        self.positionType = positionType
        self.side = side

class Match:

    def __init__(self):
        self.G = {
            0: [1, 1, 1, 1, 1, 1, 0],
            1: [0, 1, 1, 0, 0, 0, 0],
            2: [1, 1, 0, 1, 1, 0, 1],
            3: [1, 1, 1, 1, 0, 0, 1],
            4: [0, 1, 1, 0, 0, 1, 1],
            5: [1, 0, 1, 1, 0, 1, 1],
            6: [1, 0, 1, 1, 1, 1, 1],
            7: [1, 1, 1, 0, 0, 0, 0],
            8: [1, 1, 1, 1, 1, 1, 1],
            9: [1, 1, 1, 1, 0, 1, 1]
        }
        self.M = {}
        self.image_cache = {}

    def _makeImage(self,c):
        image = None
        if c == "+":
            image = [
                ["*", "*", "*", "*", "*"],
                ["*", "*", "*", "*", "*"],
                ["*", "*", "@", "*", "*"],
                ["*", "*", "@", "*", "*"],
                ["@", "@", "@", "@", "@"],
                ["*", "*", "@", "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值