agent124 发表于 2023-8-25 01:04:33

难度骤增

前几天做了个程序,可以处理用火柴棒摆成1位数加减乘除的式子,只动1根火柴使等式成立的问题。也有些游戏是两位数,想是否能修改程序支持。
结果发现复杂多了。原来不管怎么变,运算符号(包括等号)都不会超过2个。但是两位数一来就不一定了。比如9 - 8 = 98,答案是9 - 8 = 9 / 9,多出来了一个运算符。数字间的变换也复杂多了,一位数的话,一个数字只能变为另一个数字,但是两位数一来,4可以变成11。
多了一位,难度骤增,不禁打退堂鼓,不想搞了。

横槊赋诗 发表于 2023-8-25 01:14:27

有个万能办法:如果题目没说明确,就把一根火柴移动到等号上,变成不等式。

agent124 发表于 2023-8-25 01:16:24

横槊赋诗 发表于 2023-8-25 01:14
有个万能办法:如果题目没说明确,就把一根火柴移动到等号上,变成不等式。

规定不许用不等号,包括不等于,大于和小于号

沧海一声笑 发表于 2023-8-25 01:22:34

本帖最后由 沧海一声笑 于 2023-8-25 01:24 编辑

建立个对照表,将每个数字对应的火柴棒模型,以及所有缺少1根火柴和增加1根火柴的模型(当然是正确的模型)。比如8可能变6或9
然后做个循环,判断是否是合理答案,(当然也要包括可能移动的火柴变成运算符号)

agent124 发表于 2023-8-25 01:28:20

沧海一声笑 发表于 2023-8-25 01:22
建立个对照表,将每个数字对应的火柴棒模型,以及所有缺少1根火柴和增加1根火柴的模型(当然是正确的模型) ...
一位数做出来了,两位数太复杂,除了分析复杂的转换规律,还得做个表达式的解析器,太麻烦。

沧海一声笑 发表于 2023-8-25 01:36:09

agent124 发表于 2023-8-25 01:28
一位数做出来了,两位数太复杂,除了分析复杂的转换规律,还得做个表达式的解析器,太麻烦。

还有个问题就是是否允许出现2个等号?

比如11-1=1变成1=1=1是否合理?:lol

agent124 发表于 2023-8-25 01:38:52

本帖最后由 agent124 于 2023-8-25 01:41 编辑

沧海一声笑 发表于 2023-8-25 01:36
还有个问题就是是否允许出现2个等号?

比如11-1=1变成1=1=1是否合理?
这个合理,1位数就有这种情况,比如 9 + 9 = 9 有三个答案 9 + 0 = 9; 0 + 9 = 9; 9 = 9 = 9

另外,等号放在前面也是允许的,比如1 - 8 = 7 也有三个答案1 + 6 = 7; 7 - 0 = 7;1 = 8 - 7

agent124 发表于 2023-8-25 01:41:10

另外,等号放在前面也是允许的,比如1 - 8 = 7 也有三个答案1 + 6 = 7; 7 - 0 = 7;1 = 8 - 7

沧海一声笑 发表于 2023-8-25 01:48:31

本帖最后由 沧海一声笑 于 2023-8-25 02:54 编辑

还有就是我看了下网上的图片,1有的就是1根火柴棒,而有的是2根火柴棒竖排的,
所以编程时要对这方面做个硬性规定。





所以编程的复杂性的确够复杂的:)

agent124 发表于 2023-8-25 01:54:11

沧海一声笑 发表于 2023-8-25 01:48
还有就是我看了下网上的图片,1有的就是1根火柴棒,而有的是2根火柴棒竖排的,这时候的11就不可能移动1根火 ...

对于数字的表达方式首先要做个规定,比如1是用1根还是两根

gongqi 发表于 2023-8-25 01:56:03

沧海一声笑 发表于 2023-8-25 01:22
建立个对照表,将每个数字对应的火柴棒模型,以及所有缺少1根火柴和增加1根火柴的模型(当然是正确的模型) ...
是的。建立对照表,或定义变化的operation,比如数字和符号的变化的operation。考虑到通则少,可能table更方便一些。

然后就是逐数字/符号的operation多重循环了(4重?本位、operation、目标位、operation)。

这样看,似乎增加digit不会带来难度骤增,因为貌似只是增加了位置的数量。

沧海一声笑 发表于 2023-8-25 02:04:48

agent124 发表于 2023-8-25 01:54
对于数字的表达方式首先要做个规定,比如1是用1根还是两根
的确。否则图1中7移走1根火柴可能变成"-"或者"/"
而图2中的7则变成“1”了



agent124 发表于 2023-8-25 02:05:30

本帖最后由 agent124 于 2023-8-25 02:06 编辑

gongqi 发表于 2023-8-25 01:56
是的。建立对照表,或定义变化的operation,比如数字和符号的变化的operation。考虑到通则少,可能table ...
一位数,运算符号的个数固定为两个,两位数就不一定了,比如2 - 9 = 12 答案是 2 - 3 = 1 - 2,变成了3个运算符号,所以说要做个表达式解析器

gongqi 发表于 2023-8-25 02:09:36

agent124 发表于 2023-8-25 02:05
一位数,运算符号的个数固定为两个,两位数就不一定了,比如2 - 9 = 12 答案是 2 - 3 = 1 - 2,变成了3 ...

增加位置不行吗?比如1位有1+1+1=3个位置,2位有3x2-1=5个位置。

沧海一声笑 发表于 2023-8-25 02:16:15

agent124 发表于 2023-8-25 01:54
对于数字的表达方式首先要做个规定,比如1是用1根还是两根

个人倾向是1由2根火柴棒组成较为美观自然。

agent124 发表于 2023-8-25 02:19:14

gongqi 发表于 2023-8-25 02:09
增加位置不行吗?比如1位有1+1+1=3个位置,2位有3x2-1=5个位置。

1位数不用考虑那么复杂,固定两个运算符,位置也固定。2位数,运算符的个数和位置都要考虑,麻烦许多。1位数简单用条件判断就可以确定4种情况(加减乘除)加上两个等号和等号在前面两种情况,共6种情况。而2位数情况复杂,所以需要写个表达式解析器才行,简单的条件判断不行了。
而且,数字的转换规律也复杂许多。1位数再怎么变,都是1位数变成另一个1位数,而两位数就复杂了,比如4可以变成11,就是一位数可以变成两位数,两位数也可以通过插入运算符号变成两个一位数,情况复杂许多。

沧海一声笑 发表于 2023-8-25 02:26:41

agent124 发表于 2023-8-25 02:19
1位数不用考虑那么复杂,固定两个运算符,位置也固定。2位数,运算符的个数和位置都要考虑,麻烦许多。1 ...

如果是4变成11这种情况,其实可以直接判断等式是否成立了,因为移动的火柴不可能到其他地方了

agent124 发表于 2023-8-25 06:58:08

又碰到几道题,需要修改原来的程序才能处理,特别是一道 4 + 0 = -4,答案 4 - 0 = +4
看来原来程序的设计有问题,虽然可以处理绝大多数1位数的问题,但因过度简化,造成扩展性差。
页: [1]
查看完整版本: 难度骤增