你好我想弄清楚如何編寫一個代碼,以便循環和>打印所有可能的結果,例如,如果我們從一個數組開始。printling所有可能的結果C++?
string alphabet[2][4] = { {"A","D","G","J"},
{"B","E","H","K"}};
現在我需要一組將利用一切應該站出來爲16個可能的結果元素打印出所有不同的可能結果 循環。
的例子的結果將是:
ADGJ
ADGK
ADHJ
ADHK
etc....
你好我想弄清楚如何編寫一個代碼,以便循環和>打印所有可能的結果,例如,如果我們從一個數組開始。printling所有可能的結果C++?
string alphabet[2][4] = { {"A","D","G","J"},
{"B","E","H","K"}};
現在我需要一組將利用一切應該站出來爲16個可能的結果元素打印出所有不同的可能結果 循環。
的例子的結果將是:
ADGJ
ADGK
ADHJ
ADHK
etc....
你要找的組合。
您可以使用遞歸發生器等,例如:
#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'
如果你被允許使用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());
}
這不是OP顯示的預期結果 – sehe
通常情況下,當產生組合和排列,這可以查看(和解決)作爲一個簡單的事情計數。
在這種情況下,您在四個位置的每一個位置都有兩種可能性。總之,你真正擁有的是一個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";
}
儘管這顯然不是(甚至接近)做這項工作的唯一辦法,也許甚至不是最明顯的,我認爲這是在至少比大多數替代品簡單一些。
您是否需要使用循環?或者允許使用最好的工具來完成這項工作? –