最近,我一直在尝试解决一个问题,要求我从每一行中仅选择1个元素来查找所有不同的组合。例如,我要输入n行,每行2个字符串。但是,我只想找到所有不同的组合,我从每一行中选择1个字符串。
例:
输入:
3
alex bob
straw mat
eat drink
组合示例:
亚历克斯秸秆饮料
这导致2 ^ n个组合,在这种情况下为2 ^ 3 = 8个组合。但是,如果我要使用n for循环来查找组合
例如
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int n;
int main(int argc, char ** argv) {
cin >> n; //rows of words
string words[n][2]; //the words with 2 words per row
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2; j++) {
cin >> words[i][j]; //input of words
}
}
//finding all possible combinations
for (int i =0; i<n; i++){
for (int j=0; j<2; j++){
for (int x=0; x<2; x++){
//and so on per n
}
}
}
return 0;
}
这将需要n个for循环才能找出数组的所有组合,而每行只取一项。找到大小为n的所有不同组合的最佳和最简单的方法是什么,因为我将从每一行的两个字符串中取出1个字符串?谢谢。
最佳答案
对于每行始终有2个元素的设置,一种非常简单的解决方案是使用数据类型整数并将每个位解释为相应行中第一列或第二列的决策;然后只需从0到2 ^ n-1进行计数即可获得所有组合。
应用于您的示例,将如下所示:
int bits meaning
0 000 alex,straw,eat
1 001 alex,straw,drink
2 010 alex,mat,eat
3 011 alex,mat,dring
4 100 bob,straw,eat
5 101 bob,straw,drink
6 110 bob,mat,eat
7 111 bob,mat,drink
对于任何给定的整数值0..7,请使用位移运算符或&-bitmask将每个位映射到列索引:
void getCombinationRepresentedByIntValue(vector<string>& combination, int value) {
int mask = 1;
for (int i=n-1; i>=0; i--) {
if (value & mask)
combination.push_back(words[i][1]);
else
combination.push_back(words[i][0]);
mask = mask << 1;
}
}
关于c++ - 在2D阵列的每一行中找到带有1个元素的所有可能组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41203125/