Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Кобинирование элементов |
Автор: Ogurtsova 2.7.2009, 11:59 |
Дорогие дузья! Проблема состоит в следующем: есть несколько групп (все элементы текстовые, но это не принципиально): свойство1, свойство2, свойство3, .. свойствоN (количество групп задается пользователем, зарание мы не знаем) для каждой группы существует свой набор значений, тоже заранее неопределенный свойство1 -> {A(1), A(2),..A(m1)} cвойство2 -> {B(1), B(2),..B(m2)} .. свойствоN -> {X(1),X(2),..X(mn)} необходимо создать список уникальных сочетаний, причем порядок групп в отдельном взятом элементе строгий и известен например, дано: цвет. размер. фактура цвет -> {красный, желтый, синий, черный} размер -> {большой, маленький} фактура -> {металл, пластик, дерево} необходимо сгенерировать список: красный. большой. металл красный. большой. пластик красный. большой. дерево красный. маленький. металл красный. маленький. пластик красный. маленьский. дерево желтый. большой. металл желтый. большой. пластик ... и т.д. проблема заключается в том, что количесвто групп (свойств) заранее неизвестно, как и количесвто элементов в каждой группе. никак не могу найти простое решение. очень буду благодарна помощи! |
Автор: nworm 2.7.2009, 15:03 |
Да по-разному можно. Можно циклами for c рекурсией. (Наверное нагляднее всего.) От первой группы до последней. Можно как при устном счёте - меняем значение в последней группе на следующее, если достигнуто последнее значение меняем предпоследнее и т.д. |
Автор: Ogurtsova 2.7.2009, 15:15 | ||
да, я все это понимаю и могу реализовать при заранее известном количестве свойств. а в данном случае я не знаю, сколько свойств будет: два или десять, и сколько в таком случае циклов for нужно или как это организовать, чтобы было не важно количество циклов. |
Автор: nworm 2.7.2009, 15:41 | ||
Как-то так
|
Автор: Akina 2.7.2009, 15:51 | ||||
Ну по-любому у тебя получается двумерный массив... наиболее просто сделать так: первая размерность = количеству свойств, вторая = максимальному количеству значений свойства. Где значений меньше - там соответственно Null-ы. И обрабатывай. В рекурсивную функцию передаёшь текущий вектор уже выбранных номеров записей по колонкам и номер следующей колонки. Если она последняя - организуешь вывод, если нет - рекурсивный вызов, добавляя в цикле каждую ячейку очередной колонки и увеличив на 1 номер колонки следующей.
|