最近一直看到诸如
的问题,闲的无聊,便写了段代码来自动解答这类问题。
初步只能支持标准的数字变化,即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 = [
["*", "*", "*", "*", "*"],
["*", "*", "*", "*", "*"],
["*", "*", "@", "*", "*"],
["*", "*", "@", "*", "*"],
["@", "@", "@", "@", "@"],
["*", "*", "@", "