Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Кобинирование элементов


Автор: 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
Цитата(nworm @ 2.7.2009,  15:03)
Да по-разному можно.

Можно циклами for c рекурсией. (Наверное нагляднее всего.) От первой группы до последней.

Можно как при устном счёте - меняем значение в последней группе на следующее, если достигнуто последнее значение меняем предпоследнее и т.д.

да, я все это понимаю и могу реализовать при заранее известном количестве свойств.

а в данном случае я не знаю, сколько свойств будет: два или десять, и сколько в таком случае циклов for нужно или как это организовать, чтобы было не важно количество циклов.

Автор: nworm 2.7.2009, 15:41
Как-то так

Код

void donext(int T)
{
 for(i=0;i<кол-во свойств в группе номер T;i++)
  {
   меняем элемент в группе номер T;
   if (T==номер последней группы) 
    печатаем сочетание;
   else
    donext(T++); 
  }


Автор: Akina 2.7.2009, 15:51
Ну по-любому у тебя получается двумерный массив... наиболее просто сделать так: первая размерность = количеству свойств, вторая = максимальному количеству значений свойства. Где значений меньше - там соответственно Null-ы. И обрабатывай. В рекурсивную функцию передаёшь текущий вектор уже выбранных номеров записей по колонкам и номер следующей колонки. Если она последняя - организуешь вывод, если нет - рекурсивный вызов, добавляя в цикле каждую ячейку очередной колонки и увеличив на 1 номер колонки следующей.

Код

Option Explicit
Option Base 0

Private Sub Form_load()
Dim x(2, 3) As String ' последний элемент каждой строки свойств = пустая строка, терминатор
x(0, 0) = "красный"
x(0, 1) = "жёлтый"
x(1, 0) = "металл"
x(1, 1) = "дерево"
x(1, 2) = "пластик"
x(2, 0) = "большой"
x(2, 1) = "маленький"
Dim y(2) As Integer
Call rec(x(), y(), 0)
End Sub

Sub rec(prop() As String, sel() As Integer, col As Integer)
Dim i As Integer, j As Integer
i = 0
If col = UBound(prop, 1) Then
  Do While prop(col, i) <> ""
    For j = 0 To col - 1
      Debug.Print prop(j, sel(j)); ".";
    Next
    Debug.Print prop(col, i)
    i = i + 1
  Loop
Else
  Do While prop(col, i) <> ""
    sel(col) = i
    Call rec(prop(), sel(), col + 1)
    i = i + 1
  Loop
End If
End Sub


Цитата

красный.металл.большой
красный.металл.маленький
красный.дерево.большой
красный.дерево.маленький
красный.пластик.большой
красный.пластик.маленький
жёлтый.металл.большой
жёлтый.металл.маленький
жёлтый.дерево.большой
жёлтый.дерево.маленький
жёлтый.пластик.большой
жёлтый.пластик.маленький



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)