C ++中Mastermind算法的递归for循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++中Mastermind算法的递归for循环相关的知识,希望对你有一定的参考价值。
我想为Mastermind算法(https://www.swtestacademy.com/algorithms-mastermind/)创建一个数字池。池应由大小为[[n的Mastermind代码的所有可能组合组成。因此,例如,当n = 4时,池应如下所示:
[0000] [0001] [0002] .... [5555]with
n = 5
:[00000] .... [55555]其中每个数字代表策划解决方案中的一种颜色。因此,例如[3101]将是红色,蓝色,白色,蓝色。
我制作了一个函数,用
n = 4
创建一个池:vector<string> createPool4()
{
vector<string> pool;
for (int i = 0; i < colours; i++)
for (int j = 0; j < colours; j++)
for (int k = 0; k < colours; k++)
for (int l = 0; l < colours; l++)
pool.push_back(to_string(i) + to_string(j) + to_string(k) + to_string(l));
return pool;
}
然后我尝试将这个函数转换为某种递归嵌套的for循环,但是请自己找:
vector<string> fillPool(int n, vector<string> pool, const string& s) { if (n == 0) { pool.push_back(s); s.clear(); return pool; } for (int i = 0; i < n; i++) { s += to_string(i); pool = fillPool(n-1,pool,s); } }
此代码不起作用,它只应显示我的前进方向。因此,我需要一个可以采用n维,然后创建可能代码列表的函数。到目前为止,我正在使用向量字符串,但我很高兴听到其他可能性。
也许有人可以帮我解决这个问题,因为我知道那里确实有一个很好的解决方案。
谢谢!
此question对于如何进行组合有一些很好的答案。将Rosetta代码中的此solution和此solution分别组合和组合,可以通过以下方式解决问题:
#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;
void permutation(string str, vector<string> *result) {
auto strCopy = str;
std::sort(str.begin(), str.end());
do {
result->push_back(str);
} while (std::next_permutation(str.begin(), str.end()));
// To avoid duplication
result->erase(std::remove(result->begin(), result->end(), strCopy), result->end());
}
void combination(int n, int numberOfColours, vector<string> *result) {
vector<string> colours;
for (int i = 0; i < numberOfColours; i++)
colours.push_back(to_string(i));
auto s = colours.size() - 1;
vector<int> v(n + 1, 0);
while (true) {
for (int i = 0; i < n; ++i) {
if (v[i] > s) {
v[i + 1] += 1;
for (int k = i; k >= 0; --k) {
v[k] = v[i + 1];
}
}
}
if (v[n] > 0)
break;
string str{};
for (size_t i = 0; i < n; ++i)
str.append(colours[v[i]]);
result->push_back(str);
v[0] += 1;
}
}
void createPoolN(int n, int numberOfColours, vector<string> *pool) {
combination(n, numberOfColours, pool);
auto perms = make_unique<vector<string>>();
for (const auto &p : *pool) {
permutation(p, perms.get());
}
pool->insert(pool->end(), perms->begin(), perms->end());
sort(pool->begin(), pool->end());
}
int main() {
int n = 5;
int numberOfColours = 10;
auto pool = make_unique<vector<string>>();
createPoolN(n, numberOfColours, pool.get());
for (const auto &p : *pool)
cout << "[" << p << "]
";
return 0;
}
输出:
[00000] [00001] [00002] ... [99997] [99998] [99999]
想法是:为给定的
n
和numberOfColours
创建所有可能的组合。- 为每个组合创建所有不同的排列,将其添加到组合中,然后删除所有重复项。
以上是关于C ++中Mastermind算法的递归for循环的主要内容,如果未能解决你的问题,请参考以下文章