2015-11-27 55 views
0

你好我想弄清楚如何編寫一個代碼,以便循環和>打印所有可能的結果,例如,如果我們從一個數組開始。printling所有可能的結果C++?

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

如果你被允許使用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()); 
} 
+0

這不是OP顯示的預期結果 – sehe

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"; 
} 

儘管這顯然不是(甚至接近)做這項工作的唯一辦法,也許甚至不是最明顯的,我認爲這是在至少比大多數替代品簡單一些。

相關問題