我正在尝试建立一个数独游戏的字母而不是数字。将有一个空框,如下所示:
每一个小盒子将充满一个字母,这样所有的水平和垂直的字母形成单词。为了帮助用户,我会给他们6个字,这将工作,但他们必须找出如何安排这6个字。正确完成的方框示例:
对于这个为拼字游戏玩家设计的数独版本,oxo是一个有效的单词(我使用一个txt文件作为有效单词的列表)。
我遇到的问题是:程序如何计算出水平和垂直组合在一起的所有3个字母单词(我将从这个子集中选择6个单词输出给用户)。
txt文件存储在一个集合中,因此每个单词都是一个字符串元素。我想循环遍历集合中的所有单词,并将每个单词分解成一个字符数组。但这似乎不太可能。你对如何产生所有可能的解决方案有什么想法吗?
1条答案
按热度按时间aurhwmvo1#
按照要求,这是我经过几个小时的修改后提出的解决方案。它由三个主要部分组成:做作业的主类、单词类和词典帮助类(还有一个用于从文件中读取单词列表的加载程序。)
装载机:
文字:
单词类的主要原因是预先计算组成字符。
词典:
这里没什么好解释的。它包含单词列表和一个根据单词的第一个字母查找单词的Map。它还有一个验证单词的方法。
主程序:
这是第二次尝试(因此run2())。第一种是暴力,从完整列表中每行选取一个单词,然后检查垂直单词是否有效。不用说,这种方法效率不高(我的列表包含1347个单词,因此需要检查2474829630个组合。)
第二种方法的目标是减少组合的数量,即只检查有可能有效的行组合。
这就是它的工作原理:我们遍历完整的单词列表。在每次迭代中,选定的单词“w”是第一列。然后根据w的第一、第二和第三个字母筛选出三个可能的行列表。
这些简化的列表比完整的列表小得多,我们对这些列表进行了详尽的搜索。对于每个组合,第一列保持不变。
评估检查6个单词中的每一个都是有效的,并且确实有6个唯一的单词。任何有效的组合都会保存为一个集合,在Map中。该集合应使任何重复项被覆盖,并且Map是并发所必需的。
最后一步是写入文件。这似乎不是很好的工作,所以我会考虑改变这一点。
在循环中,我们跟踪使用了哪些单词w。如果w1和w相同,我们跳过它。这是因为6个单词的每个(有效)组合有两种可能的形式。
与相同
编辑
找到所有的解决方案需要时间,但找到一些解决方案可以很快完成。它需要另外两行代码。
在字典构造函数中,在Map主单词列表后,在其上添加无序排列:
这将使所有随后的单词列表和集合混乱,使每个新的运行是唯一的。
在程序的主循环run2()中,在查找有效板时,在最内层循环中添加一个return语句:
它是一个返回而不是其他中断的原因是因为我们在lambda中(外部循环是stream.foreach()),所以这将退出lambda表达式。
我的期望是找到一(1)个有效的董事会与这一变化,然而,由于某种原因,我结束了约1310(确切数字不同)的结果,而不是。似乎它会在停止前完成一次完整的外环。
节日快乐!