您好我想弄清楚如何编写代码以便循环并且>打印所有可能的结果,例如,如果我们从数组开始。
string alphabet[2][4] = { {"A","D","G","J"},
{"B","E","H","K"}};
现在我需要一组循环来打印出所有不同的可能结果 使用每个应该成为16种可能结果的元素。
示例结果将是:
ADGJ
ADGK
ADHJ
ADHK
etc....
答案 0 :(得分:3)
您正在寻找组合。
您可以使用递归生成器,例如:
<强> Live On Coliru 强>
#include <string>
#include <iostream>
template<typename F>
void combis(char const* a, char const* b, F f, std::string state = "") {
if (a && b && *a && *b) {
combis(a+1, b+1, f, state + *a);
combis(a+1, b+1, f, state + *b);
} else
{
f(state);
}
}
int main() {
combis("ADGJ", "BEHK", [](auto s) { std::cout << "Found: '" << s << "'\n"; });
}
打印
Found: 'ADGJ'
Found: 'ADGK'
Found: 'ADHJ'
Found: 'ADHK'
Found: 'AEGJ'
Found: 'AEGK'
Found: 'AEHJ'
Found: 'AEHK'
Found: 'BDGJ'
Found: 'BDGK'
Found: 'BDHJ'
Found: 'BDHK'
Found: 'BEGJ'
Found: 'BEGK'
Found: 'BEHJ'
Found: 'BEHK'
答案 1 :(得分:0)
通常情况下,在生成组合和排列时,可以将其视为(并解决)一个简单的计算问题。
在这种情况下,您在四个位置中的每一个都有两种可能性。简而言之,你真正拥有的是一个4位二进制数字,有一些相当奇怪的“数字”。在这种情况下,我们可以简单地从0到15进行计数,并使用该数字的位作为索引来选择要在输出中显示的正确“数字”。
执行此操作的代码可能如下所示:
char output[][2] = { { 'A', 'B'}, {'D', 'E'}, { 'G', 'H'}, {'J', 'K'} };
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 4; j++)
std::cout << output[j][(i>>(3-j)) & 1];
std::cout << "\n";
}
虽然它显然不是(甚至接近)完成这项工作的唯一方法,也许甚至不是最明显的,但我认为它至少比大多数替代方案更简单。
答案 2 :(得分:-1)
如果您被允许使用STL的功能,std::next_permutation功能将完全符合您的要求:
std::vector<std::vector<std::string>> alphabet = { {"A","D","G","J"},
{"B","E","H","K"}};
for(auto& v : alphabet) {
std::sort(v.begin(), v.end());
do {
for(const auto& c : v) {
std::cout << c << std::endl;
}
} while(std::next_permutation(v.begin(), v.end());
}