找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 45|回复: 1

[【心情日记】] 火柴棒游戏

[复制链接]
发表于 2023-8-21 00:29:34 | 显示全部楼层 |阅读模式
本帖最后由 agent124 于 2023-8-21 00:39 编辑

偶然看到火柴棒游戏的视频。用火柴棒按照七段显示器的方式代表数字和运算符号(包括等号),比如1用两根火柴接起来表示,3用5根火柴表示,8用7根火柴表示,一根火柴斜摆表示除号,两根火柴并排,表示等号,等等,排成一个式子(多为一位数的加减乘除运算)。要求只动一根火柴,使等式成立。

读小学的时候也看到过类似的智力游戏。不知道为什么,最讨厌火柴棒游戏,从来不玩。可见我这人不太爱动脑筋。

现在火柴用得少了,不太好找了,不过可以用牙签代替。我索性直接心算。玩了一会,忽然想到这应该有规律可循,于是想编程来解决。

思路是先分析每个数字和运算符号可能的转换方式,比如2只能转成3,1只能转成7(从别的数字拿来一根火柴棒接上),除了0,其他数字都可以在前面加上一根火柴棒变成它的相反数(负0没有意义,所以排除),7比较特殊,除了可以变成-7,还可变成-1(规定7用3根火柴而不是4根表示,头部没有转折)。运算符号也可以转换,比如减号(用1根火柴表示),加上一根,变成加号或者等号;斜着摆,变成除号。

然后是分析转换形式,只有4种:不变,内部转换(如3变成5),去掉一根(如6变成5),从别处拿来一根(如3变成9,1变成-1)。

这样分析清楚后,再设计数据结构。最后用二维数组来表示,数组的行号代表变换前的数字,列号代表变换后的数字,值代表操作类型即转换的形式。比如transform[5, 6] = 3,5代表原来的数字是3,6代表可以转换成6,3是值,表示通过从别处拿来一根火柴棒转换成的。同样,用2表示去掉一根,1表示内部转换,0表示无法转换(比如1无法转换成4)。

然后就是用嵌套循环穷举所有变化,再验证结果是否正确,将正确结果打印出来就好了。结果的显示,如果要用图片或者动画表示,比较直观生动,但做起来比较麻烦,就省了。

因为排列组合的运算量不大,所以只是简单嵌套循环,也没用回溯法等算法进行优化。

手工玩这个游戏,难度主要在判断如何使等式成立,试探各个数字的变换,而对于是否已经移动了一根火柴无需判断。但编程时,数字的变换只需要一次性分析完毕,以后就不用管了,而检查是否已经移动了一根火柴,却成为相对的难点。机器很笨,已经移动了一根火柴,它是不知道的,必须编程告诉它。解决了这个问题,程序基本可以正常运行了。

接下来就是测试,做了几十道题目,发现一些原来没有想到的问题,逐步修正程序。

一是两个等号的情况。比如原来火柴棒排成8 - 9 = 9,有多种答案,比如0 + 9 = 9, 0 - 9 = -9都是正确答案(规定9用6根火柴而不是5根表示,尾部有转折),但还有个答案 9 = 9 = 9 也是正确答案。这个没有想到。

二是等号在前面的情况。比如1 - 8 = 7,也有多种答案,比如1 + 6 = 7,7 - 0 = 7都是正确答案,但还有个答案可能不容易想到1 = 8 - 7,把等号换到前面去了。

三是需要括号的情况。比如0 - 6 = 8,正确答案是0 + 6 = 6,但程序还给出另一个答案(我缺省设置成输出所有答案)0 - -6 = 6,乍一看好像也对。但是在数学里,负6必须加上括号,因此这个答案应该不正确,修改程序加上了限制条件。

7加上负号,可以变成-7,也可以变成-1,也是原来没有想到的。

又测试了一批题目,貌似已解决了一位数加减乘除,只移动一根火柴棒的问题,如果改改程序,还可以处理两位数,两根火柴棒的问题,有空再搞了。

不过,程序编出来之后,这个智力游戏就废了。当然,废了也好,少浪费些时间。


评分

1

查看全部评分

回复

使用道具 举报

发表于 2023-8-21 00:37:29 | 显示全部楼层
火柴棒类题目应该是小学奥数里面没有规则可寻的,还有给出数字和符号凑出一个结果来的,比如算24类。
剩下来的就是繁琐的不定方程类题目,这几种繁一点能让人算半天。

评分

1

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-10-1 09:33 , Processed in 0.131764 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表