Мне нужно запрограммировать все возможные наборы чисел от 1
до N
для произвольного числа m
целых чисел без перестановки.
Так как я не знаю, как это объяснить, вот несколько примеров:
для m = 2
vector<vector<int>> box;
int N = 5;
for(int i = 1; i <= N; i++) {
for(int j = N; j >= i; j--) {
vector<int> dummy;
dummy.push_back(i);
dummy.push_back(j);
box.push_back(dummy);
}
}
для m = 3
vector<vector<int>> box;
int N = 5;
for(int i = 1; i <= N; i++) {
for(int j = N; j >= i; j--) {
for(int k = N; k >= j; k--) {
vector<int> dummy;
dummy.push_back(i);
dummy.push_back(j);
dummy.push_back(k);
box.push_back(dummy);
}
}
}
Это работает отлично, и результат - это то, что мне нужно. Но, как уже упоминалось, m
может быть произвольным, и я не могу потрудиться реализовать его для m = 37
или того, что когда-либо. N
и m
являются известными значениями, но изменяются во время работы программы. Должен быть лучший способ реализовать это, чем для случая m = 37
для реализации строки из 37-для-циклов. Кто-нибудь может мне помочь? Я добрый, невежественный:\
edit: чтобы лучше объяснить, что я ищу здесь, еще несколько примеров.
Скажем, N = 5
и m = 4
, что 1223
является допустимым решением для меня, 124
не так, как оно коротко. Скажем, я уже нашел 1223
в качестве решения, чем мне не нужно 2123
, 2213
или любая другая перестановка этого числа.
edit2: Или, если вы предпочитаете более визуальную (математическую?) формулировку проблемы, вы идете.
Рассмотрим m
размерность. Если m
равно 2, вы останетесь с матрицей размера N
. Я ищу верхний (или нижний) треугольник этой матрицы, включая диагональ. Перейдем к m = 3
, матрица станет трехмерным кубом (или тензором, если вы этого пожелаете), теперь я ищу верхний (или нижний) тетраэдр, включая диагональную равнину. Для более высоких размеров, чем 3, я ищу гипертетраэдр гиперкуба, включая гипердиагональную плоскость.