Поиск всех возможных комбинаций 4 векторов с C ++ - PullRequest
0 голосов
/ 16 июля 2011

Я хочу найти все возможные комбинации четырех базисных векторов (размерность = 4), в зависимости от ввода пользователя.Повторение должно быть разрешено.

Т.е. давайте вызовем векторы a, b, c и d.

Если пользователь вводит N = 3, комбинации могут быть:

aaaaab aac.,,ddd

Я старался изо всех сил, но я пока еще не знаком с C ++.

Приложение также должно вычислять умножение базисных векторов (то есть a * a * a) и сохранятьрезультат.

Я наверняка заглянул на форум раньше, но нашел статьи о комбинировании только целых чисел или элементов векторов.

Спасибо за вашу помощь.

Ответы [ 4 ]

1 голос
/ 16 июля 2011

Если ваша программа основана на linux (например, у вас есть доступ к оболочке типа bash), вы можете получить все комбинации, скажем, 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 может выглядеть как | 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);

что-то вроде этого, хотя а) непроверенное б) неполное в) работает только для выборок размером до 26 векторов (хорошо 52, если вы включите заглавные буквы)

0 голосов
/ 16 июля 2011

Поскольку это домашнее задание, я не напишу вам полное решение. Проверьте этот псевдокод:

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. Вы также должны выяснить, какую начальную глубину вы должны пройти (попробуйте рассуждать об этом, и не используйте метод проб и ошибок).

Надеюсь, это поможет.

0 голосов
/ 16 июля 2011

Я хотел бы изучить использование многомерного массива (в данном случае 2-мерного массива).

Теперь мой уровень программирования также не так хорош, поэтому мои программы, как правило, немного неуклюжи, но, надеюсь, вы сможете понять, о чем я говорю, в примере с псевдокодом ниже!

основывать количество гнезд на числе, введенном пользователем:

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

удачи!

0 голосов
/ 16 июля 2011

поставить на две петли, которые 4 на 4. Это будет работать через каждую возможную комбинацию.

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

Добавьте больше для петель для большей длины. Прямо сейчас он делает только 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. Что-нибудь еще, и вы захотите рекурсивную функцию.

...