使用C ++查找4个向量的所有可能组合

时间:2011-07-16 00:31:37

标签: c++ combinations

我想根据用户输入找到四个基矢量(维度= 4)的所有可能组合。应该允许重复。

即。让我们调用向量a,b,c和d。

如果用户输入N = 3,则组合可以是:

AAA AAB AAC 。 。 。 DDD

我尽我所能,但我对C ++并不熟悉。

应用程序还应计算基矢量的乘法(即a * a * a)并存储结果。

我之前确实在论坛上看了一下,但发现了关于仅将向量组合或向量组合的文章。

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

如果您的程序是基于Linux的(例如,您可以访问bash类型的shell),那么您可以通过输入命令获得说a,b,c,d的所有组合,其中N = 3: echo {a,b,c,d} {a,b,c,d} {a,b,c,d}“ - 这将打印出上面的所有组合:aaa,aab ......等。

然后你可以捕获那个输出并逐个字母地解析它并将对应于该字母的每个向量乘以一个基向量(比如说(1,1,1,1)为dim = 4)。但话说回来,你的意思是乘以向量?你的意思是找到a * a * a的大小?因为你不能将(1x4)向量相乘 - 你只能拿它们的点积。 (因此,* a * a的唯一可能解释似乎是| a | ^ 3。)

调用echo命令的示例:

#include <stdio.h>
#include <string>
#include <vector>

int n; //user given - n>1
Vector4D* vectors[n]; // Or some other name for the class
// Have the user input the vectors
std::string base = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
std::string list = "{"+base.substr(0,2*n+1)+"}";
std::string query = "echo ";
for(int i = 0; i<4; i++){
    query += list;
}
File *file;
file=popen(query.c_string(), "r");
char combo[4];
std::vector<Vector4D> results;
while(fscanf(file,"%s", combo)){
    Vector4D result(1,1,1,1); //our default (identity) vector
    for(int i = 0; i<4; i++){
        result = Vector4D.multiply(result, Vectors[combo[i]-'a']);
    }
    results.push_back(result);
} 
fclose(file);

类似这样的事情,虽然a)未经测试b)不完整c)仅适用于最多26个矢量的样本量(如果包括大写字母则为52)

答案 1 :(得分:0)

我会研究使用多维数组(在这种情况下,是一个二维数组)。

现在,我的编程水平也不是那么好,所以我的程序往往有点笨重,但希望你能在下面的伪代码示例中了解我在谈论的内容!

基于用户输入的数字的嵌套计数:

user enters 4

array{ar1{a,b,c,d},ar2{a,b,c,d},ar3{a,b,c,d}ar4{a,b,c,d}}
create counter var for each array (c1, c2, c3, c4)

loop increment counters c1-4 for each letter (a-b)
print value from array table.

我知道它非常邋,,但它是我能想到的最好的东西(近3年没有编程!LOL)但绝对是多维数组:

http://www.tenouk.com/clabworksheet/labworksheet10.html

祝你好运!

答案 2 :(得分:0)

由于这是作业,我不会给你一个完整的解决方案。检查这个伪代码:

all(&srcvectors, depth, temp, &resultvectors)
    if (depth == 0)
        resultvectors.push(temp);
    else
        for (int i=0; i < 4; i++)
            all(srcvectors, depth-1, crossproduct(temp, srcvectors[i]), resultvectors);

你必须从外部for循环调用它,将每个srcvector作为temp传递。你还必须弄清楚你必须通过的初始深度(尝试推理它,不要使用反复试验)。

希望这有帮助。

答案 3 :(得分:-2)

加上两个for 4循环的for循环。 这将贯穿每一种可能的组合。

vector<char> temp;


temp.push_back('a');
temp.push_back('b');
temp.push_back('c');
temp.push_back('d');



for(int i = 0; i < 4; i++)
{
    for(int k = 0; k < 4; k++)
        cout << temp[i] << temp[k] << endl;
}

为更长的长度添加更多for循环。现在它一次只能输出2个输出组合。

例如:

vector<char> temp;


temp.push_back('a');
temp.push_back('b');
temp.push_back('c');
temp.push_back('d');


for(int j = 0; j < 4; j++)
{
    for(int i = 0; i < 4; i++)
    {
        for(int k = 0; k < 4; k++)
        {
            cout << temp[j] << temp[i] << temp[k] << endl;
            Sleep(25);
        }
    }
}

system("PAUSE");

这将输出每个可能的组合,长度为3。 还有更多,你会想要一个递归函数。