如果忽略关于不多次使用同一字母多维数据集的规则,请考虑如何将单词排列在任意大的Boggle网格上。还要假设您有无限数量的字母立方体(所有字母都存在),并且是。Qu
Q
MISSISSIPPI
可以仅使用6个立方体来排列单词。这是一种可能的安排:
S
MIS
PP
从开始,M
我们反复在水平,垂直或对角线上采取任何步骤,直到拼出整个单词。
令人惊讶的是,更长的短语AMANAPLANACANALPANAMA
也只需要6个立方体:
MAN
PLC
但是,较长,更复杂的字符串所需的最小多维数据集并不总是很明显。
挑战
编写一个程序,该程序接受一个字符串,并以类似于Boggle的方式对其进行排列,以便使用最少的多维数据集。(生成的网格的尺寸和空单元格的数量无关。)
假设除了空格(十六进制代码21至7E)之外,每个可打印ASCII字符都具有无限数量的多维数据集,因为它用作空网格单元。仅输入可打印的ASCII字符串(无空格)。
输入应从标准输入或命令行中获取。输出应转到stdout(或最接近的备用输出)。
输出中的前导或尾随换行符和空格都可以(但希望没有多余的数量)。
当字符串变长时,搜索空间将呈指数级增长,但是您无需尝试提高算法的效率(尽管那会很不错:))。这是代码高尔夫球,因此以字节为单位的最短解决方案为准。
例
如果输入是Oklahoma!
(最少8个字符),则它们都是有效的输出,因为它们都具有正好8个填充的网格单元,并且它们遵循(修订)的Boggle读取模式:
Oklaho
!m
要么
!
Oamo
klh
要么
lkO
!amo
h
等等
4
这听起来像一个艰难的优化问题。我认为这将是一个不错的代码挑战。
—
马丁·恩德2014年
我无法编辑,因为低重复用户正在等待编辑,但是密西西比州有两个double-s。
—
彼得·泰勒
区分大小写怎么办?
—
自豪的haskeller 2014年
@proudhaskeller我确定输入不区分大小写,因为:1)输入只是任何可打印的ASCII 2)OP否则未提及3)如果输入不区分大小写,俄克拉荷马州的例子就不会太少。
—
Martin Ender 2014年
@MartinBüttner我认为您的意思是区分大小写
—
Ypnypn