Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск всех возможных комбинаций


Layner ©   (2006-05-05 11:58:00) 

Здравствуйте! Помогите найти алгоритм поиска всех возможных комбинаций последовательностей чисел. Т.е. дано, на входе массив чисел. Например 3 строки на 10 столбиков.

Вот пример:

procedure TForm1.Button1Click(Sender: TObject);
var
a: array of array of integer;
i,j: integer;
s: string;
begin
 inherited;
 SetLength(a,3,10);
 for i:=0 to 2 do
  for j:=0 to 9 do
   a[i,j]:=Random(50);

 s:='';
 for i:=0 to 2 do
  begin
  for j:=0 to 9 do
    s:=s+#9+IntToStr(a[i,j]);
   s:=s+#13#10;
  end;

  Showmessage(s);
end;


нужно записать все возможные комбинации значения данных, условие 1:
- 10 цифр в строку, одна цифра берется из одного столбика
- если в массиве вестречается число "-1", то это число в обработку не брать.

Поясню... что то с математикой не силен, а надо составить все возможные варианты составления изделия из комплектующих.... То что тут Random, на самом деле это ID товара - состовляющего. Первая строка в массиве - это "родные товары", они всегда есть, то что ниже, это его замены.  И если в масиве -1, то это просто нет замен.

Заранее благодарю за любую помощь.


Layner   (2006-05-05 15:06:00) [1]

MBo ©   (05.05.06 13:41)
Спасибо большое за рекурсию, получилось все просто на УРА!!! Только благодаря Вам :)
Всех поздравляю с Днем Победы!


TUser   (2006-05-05 13:59:00) [2]


> Layner ©   (05.05.06 13:08) [8]

until notNext (N)


Palladin   (2006-05-05 13:49:00) [3]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1145813851&n=18

адаптировать не долго


Layner   (2006-05-05 13:47:00) [4]

Огромное спасибо всем ответившим, отрабатываю, напишу, по какому пути пошел.


MBo   (2006-05-05 13:41:00) [5]

рекурсивно - не просто, а очень просто.

procedure TForm1.Button1Click(Sender: TObject);
var
 Rows, Cols: Integer;
 x, y, Rnd: Integer;
 A: array of array of Integer;
 s: string;

 procedure GetThem(Col: Integer; ss: string);
 var
   y: Integer;
 begin
   if Col = Cols then
     Memo2.Lines.Add(ss)
   else
     for y := 0 to Rows - 1 do
       if A[y, Col] > 0 then
         GetThem(Col + 1, ss + IntToStr(A[y, Col]) + ',');
 end;

begin
 Randomize;
 Memo1.Clear;
 Memo2.Clear;
 Rows := 2 + Random(4);
 Cols := 2 + Random(4);
 SetLength(A, Rows, Cols);
 for y := 0 to Rows - 1 do begin
   s := '';
   for x := 0 to Cols - 1 do begin
     Rnd := 1 + Random(50);
     Rnd := Rnd * Ord(Rnd < 35);
     A[y, x] := Rnd;
     s := s + IntToStr(Rnd) + '  ';
   end;
   Memo1.Lines.Add(s);
 end;
 GetThem(0, '');
end;


balepa   (2006-05-05 13:26:00) [6]


> Layner ©   (05.05.06 13:10) [9]

А вариант TUser неподошел ?
Если честно некода в данный момент думать об этом (работа мешает :)), но вроде сложного ничего нет.
Если сегодня "освобожусь" мож и накидаю чего-нибудь.


Layner   (2006-05-05 13:10:00) [7]

balepa ©   (05.05.06 13:07)
Да, именно так. Может есть тоже вариант решения?


Layner   (2006-05-05 13:08:00) [8]

TUser, спасибо, сейчас поразбираюсь, вроде что то усек :)


balepa   (2006-05-05 13:07:00) [9]

А если:
2    3    4
-1   19  -1
8   28    5

Как должно получиться ?

Так ?
2,3,4
2,19,4
2,19,5
2,28,4
2,28,5
8,3,4
8,19,4
8,19,5
8,28,5


TUser   (2006-05-05 13:06:00) [10]

Т.е. число этих списков (и циклов) заранее неизвестно?

type
TListsOfIntegers =
 array of
 array of integer;

var N: array of integer;
   L: TListsOfIntegers;

function Next (var N: array of integer): boolean;
var i: integer;
begin
 result := false;
 i:=high(N);
 while i >= 0 do
   if N[i] < high(L[i]) then
     inc (N[i])
     for i:=i+1 to high(N) do N[i] := 0;
     result := true;
     Break;
   else dec (i)
end;

procedure ...
begin
 // создаем L, в каждой строчке - не знаю сколько элементов, не равных -1
 ...

 for i:=0 to length(L)-1 do
   if length(L[i]) = 0 then
     {нет ни одной комбинации}

 // Пишем комбинации
 SetLength (N, length(L));
 for each i: N[i] := 0;
 repeat
   {напечатать комбинацию L[N[0],N[1],N[2]...]}
 until Next (N);
end;


Layner   (2006-05-05 12:53:00) [11]

Не совсем понял, размерность массива может быть любой, товаров может быть под 50, и замен у каждого может быть до пяти... т.е. не обязательно 3*3, а может и 50*5...


TUser   (2006-05-05 12:50:00) [12]

Создаешь три списка с возможными значениями. Далее - три вложенных цикла.


Layner   (2006-05-05 12:32:00) [13]

То, что под "результом", это бы и хотел найти. Сам найти не могу :(


Layner   (2006-05-05 12:31:00) [14]

например:

2   3   4
-1  19  -1
-1  28  -1


результат:

2,3,4
2,19,4
2,28,4


Т.е. в данном случае всего 3 результирующих строки. Если бы было все 9 цифр <> -1, то было бы 9 вариантов (3*3)


TUser   (2006-05-05 12:06:00) [15]

Приведи пример входных данных и ожидаемого результата. А то русский есть языка великий сила :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо