童年时代的杀手


我敢肯定,许多读者有时会在教室里胡说八道,而不是听老师讲。 我正是这样做的,消磨时间的一种方法是在纸上玩。 预览游戏(我仍然不知道其名称)对我来说特别有趣,但是有两个原因:它不需要第二个人,并且可以完成! 没错,这样做非常罕见。 很长一段时间以来,我一直在想该解决方案到底有多简单,现在,经过很多年,以编程方式找到它并不困难。


规则


首先,值得描述规则。 游戏从以下字段开始:


123456789
111213141
516171819


此处,从1到19的所有数字均逐字符记录,但10除外。数字从左到右逐行定位。 规则非常简单-在每个步骤中,您都需要划掉与以下条件相对应的2个数字:


  • 数字必须相同或总和为10(1和1、3和7、8和2,等等);
  • 它们必须彼此站立或串联排列。 在这种情况下,已删除的数字将被忽略。

最初几步的选项之一如下所示:


1 23456789
1 11213141
5161718 19


#2345678 9
# 1 1213141
5161718##


#2345678#
##1213141
5161718##


在没有更多移动的时刻,所有未标记的数字都添加到末尾。 整个比赛结束后,游戏结束。


#2345678#
##1213141
51 6 171 8 ##
23 4 567 8 12
131415161
718


#2345678#
##1213 1 41
5 1 # 1 71###
23#567#12
131415 1 61
718


#2345678#
##1213#41
5###71###
2 3 #567#12
1 3 1415#61
718


...


可用动作的数量迅速增加,游戏开始强劲分支。 通常,表格变得很长,以至于溢出到笔记本的下一页。 开始新批次更容易。 有时我会继续坚持不懈,但最终我放弃了。


这就提出了一个合理的问题-您能完成游戏多快? 在童年时代,可以在笔记本纸上的一列中找到解决方案-这大约是40行或360个字符。


我不知道完成游戏的保证方式。 完全不清楚如何选择策略。 如果没有,您可以尝试自己玩。


解决方案


如何寻求解决此类问题的方法? 我不确定,但我选择了通常的胸围。


我们需要一个队列,首先只包含一个初始配置。 在每一步中,我们从队列中进行以下配置,查看队列中所有可用的移动,然后将它们全部添加到队列的末尾,如果没有此类移动,则将自己声明为获胜者。


123456789 #23456789 12345678# 123456789 123456789 123456789 123456789 ...
111213141 #11213141 #11213141 ##1213141 1##213141 11#213141 11121314# ...
516171819 516171819 516171819 516171819 516171819 516#71819 51617181# ...


如果您不讨论第一个可用的解决方案,则此算法将产生所有可能的解决方案(存在无限数量的RAM时)。
实际上,至少由于队列中不断出现重复项,这种天真的方法根本没有帮助。 因此,将需要一些优化,我现在将解释:


  • 自然,需要缓存配置,以免重新排队。 这将大大增加内存使用量,但是仍然无法在合理的时间内获得解决方案。 而且,比较配置的问题急剧地出现。 由于相同大小的两个获胜配置将始终仅由删除线数字组成,因此需要使用其他方法来区分它们,否则,将无法找到所有解决方案。
  • 为了使搜索有意义且快速,最好使用优先级队列。 现场的编号越少(包括划掉的数字),应考虑越早采用这种配置;
  • 如果您需要多个解决方案,但是最好限制字段上的最大数目,那么搜索将更早地发布解决方案。

答案


如果一切正确,那么最低解决方案仅包含68个字符或8行!


我将以gif动画的形式提供它。 一些动作被合并为一个,以减少帧数:



老实说,我对这个决定有多短感到震惊。 但是,也许这种运气和其他决定不会很快实现,而且会很长吗?


不,决策一点都不罕见。 快速答案的长度为72、74和76。还有4种根本不同的解决方案,长度为80。总的来说,我设法找到了30种解决方案,长度不超过90(含),如果将边界增加到100,那么将有170个解决方案。但是寻找它们变得更加昂贵。


在扰流板下,详细描述了最佳解决方案:


隐藏文字
 123456789 111213141 516171819 123456789 111213141 5161718## 123456789 1##213141 5161718## 12345678# 1##21314# 5161718## #2345678# ###21314# 5161718## #234567## ####1314# 5161718## #234567## ####1314# 5161718## 234567131 45161718 #234567## ####1314# 51#1718## 23#567131 45161718 #234567## ####1314# 51#171### #3#567131 45161718 #234567## ####1314# 51#171### #3#567#31 451617#8 #234567## ####1314# 51#171### #3#56###1 451617#8 #234567## ####1314# 5###71### #3#56###1 451617#8 #234567## ####1314# 5###71### #3#56###1 451617#82 345671314 571356145 16178 #234567## ####1314# 5###71### #3#56###1 451617#82 345671314 57#356145 16#78 #234567## ####1314# 5###71### #3#56###1 451617#82 345671314 5###56145 16#78 #234567## ####1314# 5###71### #3#56###1 451617#82 345671314 #####6145 16#78 #234567## ####1314# 5###71### #3#56###1 451617#82 34567131# ######145 16#78 #234567## ####1314# 5###71### #3#56###1 451617#82 3456713## #######45 16#78 #234567## ####1314# 5###71### #3#56###1 451617#82 3#56713## #######45 1##78 #234567## ####1314# 5###71### #3#56###1 451617### 3#56713## #######45 1##78 #234567## ####1314# 5###71### #3#56###1 45161#### ##56713## #######45 1##78 #234567## ####1314# 5###7#### #3#56###1 45161#### ##567#3## #######45 1##78 #234567## ####1314# 5######## ###56###1 45161#### ##567#3## #######45 1##78 #234567## ####1314# ######### ####6###1 45161#### ##567#3## #######45 1##78 #234567## ####1314# ######### ####6###1 45161#### ##56##### #######45 1##78 #234567## ####1314# ######### ####6###1 45161#### ##5###### ########5 1##78 #234567## ####1314# ######### ####6###1 45161#### ######### ######### 1##78 #234567## ####131## ######### ########1 45161#### ######### ######### 1##78 #234567## ####13### ######### ######### 45161#### ######### ######### 1##78 #234567## #####3### ######### ######### 4516##### ######### ######### 1##78 #23456### ######### ######### ######### 4516##### ######### ######### 1##78 #2345#### ######### ######### ######### #516##### ######### ######### 1##78 #234##### ######### ######### ######### ##16##### ######### ######### 1##78 #23###### ######### ######### ######### ##1###### ######### ######### 1##78 #23###### ######### ######### ######### ######### ######### ######### ###78 #2####### ######### ######### ######### ######### ######### ######### ####8 ######### ######### ######### ######### ######### ######### ######### ##### 

可以在此链接中查看我的Java解决方案代码,但我警告您,这很糟糕,因为 最初编写时不发布。 在当前形式下,它将找到不超过70个字符的所有解决方案(即,仅一个解决方案)。 通过试用代码中的条件,可以轻松解决此问题。


感谢您的关注!

Source: https://habr.com/ru/post/zh-CN471642/


All Articles