我正在实施一个游戏,玩家可以提出建议,并且计算机应返回分数最高的单词。 为此,我应该从一个单词开始,然后从该单词开始添加字母(1到7),以创建一个存在的新单词。
示例:
这个想法是找到所有可能的排列,然后检查每个单词是否在字典中。我已经安装了词典,并且知道如何检查单词,但是不知道如何找到字谜。 事实是,我必须检查所有可能的单词,并且它们的大小可能不同,并且其中一些不包括所有字母。
答案 0 :(得分:1)
为什么不使用内置算法?
此页面甚至还提供了一个示例供您使用。
https://en.cppreference.com/w/cpp/algorithm/next_permutation
只需遍历所有排列,在'the'前面加上并在字典中查找即可。
答案 1 :(得分:1)
您需要所有可能大小的字母的所有排列。您可以对字母进行置换,并在大小之间循环,并在单词前添加前缀。
E。 g。
字词:
字母:y,m,s,i,r,e,a
第一置换y,m,s,i,r,e,a
第二个排列m,y,s,i,r,e,a
这是一个例子
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main() {
std::string word{"the"};
std::string letters{"ymsirea"};
std::sort(letters.begin(), letters.end());
do {
for (std::size_t i(1); i <= letters.length(); ++i) {
std::cout << word << letters.substr(0, i) << std::endl;
}
} while (std::next_permutation(letters.begin(), letters.end()));
return 0;
}
另一种解决方案是在诸如\n
之类的字母上添加特殊符号并对其进行置换。然后比较新词,直到特殊符号
字词:
字母:y,m,s,i,r,e,a,\ 0
这里是一个例子:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main() {
std::string word{"the"};
std::string letters{"ymsirea\n"};
std::sort(letters.begin(), letters.end());
do {
std::size_t pos = letters.find('\n');
if (pos > 0)
std::cout << word << letters.substr(0, pos) << std::endl;
} while (std::next_permutation(letters.begin(), letters.end()));
return 0;
}
这两种算法都会生成许多重复项。两种算法都会生成多达(n)!* n个单词,其中n是字母数。在此示例中,它将产生7 * 6 * 5 * 4 * 3 * 2 * 7 = 35280个字。如果字母重复,则std :: next_permutation将跳过某些排列。您可以使用一组过滤重复项。最多只能有7 + 7 * 6 + 7 * 6 * 5 + 7 * 6 * 5 * 4 + 7 * 6 * 5 * 4 * 3 + 7 * 6 * 5 * 4 * 3 * 2 = 8659如果所有字母都是唯一的,则使用不同的单词。因此,该算法最多可产生35280-8659 = 26621个重复项。
对于排列,您可以使用std::next_permutation
答案 2 :(得分:0)
查找字谜很简单,因为每个单词都将一个与单词相同的键与其字母排序相关联。例如:orange -> aegnor
。然后创建一个字典,该字典的键是先前定义的键,其值是具有此键的单词列表。
现在,对于您添加到输入单词中的每个字母,对单词进行排序以生成键,然后在该词典中找到与此新键相关的所有字谜。
例如,词典将包含:
dict["aegnor"] -> [ "orange", "organe" ]
示例:
input: "the"
First pass:
Key = "eht"
dict["eht"] -> [ "the" ]
Second pass, we add the letter 'm':
Key = "ehmt"
dict["ehmt"] -> [ "meth", "them" ]
...