Как указал phimuemue, это проблема с графом.У вас есть набор строк (вершин) с (направленными) ребрами.Ясно, что график должен быть связан , чтобы иметь возможность цепочки - это легко проверить.К сожалению, правила за этим немного неясны:
Если строки могут использоваться более одного раза, но ссылки не могут, тогда проблема состоит в том, чтобы найти эйлеров путь , который можетбыть сделано эффективно.Эйлеровый путь использует каждое ребро один раз, но может использовать вершины более одного раза.
// this can form a valid Eulerian path
yard
dog
god
glitter
yard -> dog -> god -> dog -> glitter
Если строки нельзя использовать более одного раза, проблема состоит в том, чтобы найти гамильтонов путь .Поскольку задача о гамильтоновом пути NP-полна, точное эффективное решение не известно.Конечно, для малых n эффективность на самом деле не важна, и решение с использованием грубой силы будет работать нормально.
Однако все не так просто, потому чтонабор графиков, которые могут использоваться в качестве входных данных для этой проблемы, ограничен.Например, ниже приведен правильный ориентированный граф (в обозначениях точка ) (*).
digraph G {
alpha -> beta;
beta -> gamma;
gamma -> beta;
gamma -> delta;
}
Однако этот граф не может быть построен из строк с использованием правил этой головоломки:Поскольку alpha и gamma оба подключаются к beta , они должны заканчиваться одним и тем же символом (допустим, они заканчиваются на 'x'), но gamma также подключается к delta , поэтому delta также должно начинаться с 'x'.Но delta не может начинаться с 'x', потому что, если бы это было так, тогда было бы ребро alpha -> delta
, которого нет в исходном графике.
Следовательно, это не совсем так же, как проблема гамильтонова пути, потому что набор входов более ограничен.Возможно, что существует эффективный алгоритм для решения проблемы цепочки строк, даже если не существует эффективного алгоритма для решения задачи о гамильтоновом пути.
Но ... я не знаю, каким будет этот алгоритм.Возможно, кто-то еще найдет реальное решение, но в то же время я надеюсь, что кто-то найдет этот ответ интересным.
(*) У него также есть гамильтонов путь: alpha -> beta -> gamma -> delta
, но это не имеет значения длячто следует.