一个流行的单词难题是通过一系列的步骤将一个单词转换成另一个单词,这些步骤只替换一个字母,并且总是产生一个有效的单词。例如,包可以通过五个步骤的路径转换为狗:
袋装->蝙蝠->猫->胶辊-> COG ->狗
在这种情况下也存在较短的路径;例如:
袋装->沼泽->犬
如果一个人画了一个图,它的顶点被文字标记,每一对单词之间都有一个边,那么从“袋子”到“狗”的最短路径是由两个边组成的。
您将编写一个程序,该程序接收所有长度相同的单词的“字典”作为输入,表示所有允许的单词,这些单词可以作为路径上的步骤出现。它应至少输出一条“最长最短路径”,即两个字之间的一条路径,即:
在上面描述的图的上下文中,这种路径的长度就是图的直径。
在退化的情况下,没有一个输入字可以转换成其他的任何一个,输出至少一条长度为零的路径,即一个单词。
发布于 2019-06-20 01:11:48
from itertools import*
def f(a):b=[((p[0],p[-1]),(len(p),p))for i in range(len(a))for p in permutations(a,i+1)if all(sum(q!=r for q,r in zip(*x))<2for x in zip(p,p[1:]))];return max(min(r for q,r in b if x==q)for x,y in b)[1]基本上,采取所有可能的路径,只保留那些是有效的,然后经过每个开始-结束组合,找到最小的路径距离,并找到最大的。
发布于 2019-06-20 02:19:35
f@x_:=MaximalBy[AdjacencyGraph[x,UnitStep[1-DistanceMatrix@x]]~FindShortestPath~##&@@@Tuples[x,2],Length]https://codegolf.stackexchange.com/questions/187132
复制相似问题