我一直在尝试通过编程来解决下面的字谜,作为自己的练习:
puzzle = [
['t', 'r', 'o', 'l', 'l'],
['u', 'u', 'a', 'a', 'y'],
['n', 'r', 'r', 'e', 'q'],
['a', 'o', 'h', 'd', 'q']]
words = ["troll", "tuna", "nut", "oral", "turd", "deal", "rut", "hey", "ear"]
但我需要一点帮助来完成这个练习。以下是我目前所做的:
将字符串转换成一个列,然后将它们放入一个列表中:
^{pr2}$所以现在我可以找到任何水平或垂直拼写的单词。正如你可能已经猜到的那样,下一步是遍历对角线并将它们放入列表中,但就是搞不清这样做的逻辑。有人能帮我吗?在
这样想:
行中的单词是序列
puzzle[a][b+i]
列中的单词是序列
puzzle[a+i][b]
对角线上的单词是序列
puzzle[a+i][b+i]
或puzzle[a+i][b-i]
对于
i=0,...,n
,每一个都对应一些整数a,b,n
,这样生成的所有索引都在表中。你可以前后检查序列。附加的约束,例如只考虑完整的行,可以通过在a,b,n
上设置约束来实现。特别是,我解释它的方式是在每种情况下都需要尽可能长的字符串;在本例中,您只需将n
设置为每个a,b
的最大可能值。在你已经有1个了。和2。趴下。我建议您从列的解决方案开始,并尝试将其应用于3中描述的序列。相反。在
首先,查看嵌套列表中所有元素的索引:
从中,您可以写下对角线上半部分的索引,以了解模式:
^{pr2}$我们如何生成这些配对列表?首先,让我们看看外部循环。外部循环将穿过第一个子列表的顶部,即对
(0,j)
,其中j
从最后一个索引开始倒数:然后,我们需要让我们的内部循环在每一步都向下并向右移动,并且永远不要超过列表的末尾:
输出:
如果使外循环从
N..-1
开始,那么还可以得到穿过中心的对角线。之后,使用类似的逻辑来得到对角线的下半部分。在为了使对角线朝另一个方向移动,您可以再次使用相同的逻辑(通过查看所需的索引,写入外部循环,然后写入内部循环),或者只需反转每个子列表(将其视为查看镜像,或在垂直线上反射二维数组!)!当你这样做时,所有的对角线都会以“相反”的方向穿过这些元素)。在
相关问题 更多 >
编程相关推荐