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]

想法是:

    为给定的nnumberOfColours创建所有可能的组合。
  1. 为每个组合创建所有不同的排列,将其添加到组合中,然后删除所有重复项。

以上是关于C ++中Mastermind算法的递归for循环的主要内容,如果未能解决你的问题,请参考以下文章

Java语言中For循环算法是不是很占据CPU资源

C语言for循环

vue中v-for循环的时候为啥要添加:key属性

java中兔子数列怎样用递归法做出来

C中的递归未排序数组搜索算法?

C语言的两个问题: 所有的递归程序均可以用非递归算法实现?递归函数中的形式参数是自动变量吗? c语言中