打印所有可能的结果c ++?

时间:2015-11-27 23:35:46

标签: c++ loops multidimensional-array permutation

您好我想弄清楚如何编写代码以便循环并且>打印所有可能的结果,例如,如果我们从数组开始。

string alphabet[2][4] = { {"A","D","G","J"},
                          {"B","E","H","K"}};

现在我需要一组循环来打印出所有不同的可能结果 使用每个应该成为16种可能结果的元素。

示例结果将是:

ADGJ
ADGK
ADHJ
ADHK
etc....

3 个答案:

答案 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());
}