Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.11;
Скачать: CL | DM;

Вниз

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

 
Layner ©   (2006-05-05 11:58) [0]

Здравствуйте! Помогите найти алгоритм поиска всех возможных комбинаций последовательностей чисел. Т.е. дано, на входе массив чисел. Например 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, то это просто нет замен.

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


 
TUser ©   (2006-05-05 12:06) [1]

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


 
Layner ©   (2006-05-05 12:31) [2]

например:

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


результат:

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


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


 
Layner ©   (2006-05-05 12:32) [3]

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


 
TUser ©   (2006-05-05 12:50) [4]

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


 
Layner ©   (2006-05-05 12:53) [5]

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


 
TUser ©   (2006-05-05 13:06) [6]

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

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;


 
balepa ©   (2006-05-05 13:07) [7]

А если:
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


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

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


 
Layner ©   (2006-05-05 13:10) [9]

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


 
balepa ©   (2006-05-05 13:26) [10]


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

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


 
MBo ©   (2006-05-05 13:41) [11]

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

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;



 
Layner ©   (2006-05-05 13:47) [12]

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


 
Palladin ©   (2006-05-05 13:49) [13]

http://delphimaster.net/view/2-1145813851/

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


 
TUser ©   (2006-05-05 13:59) [14]


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

until not Next (N)


 
Layner ©   (2006-05-05 15:06) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2006.06.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
15-1147817991
Германн
2006-05-17 02:19
2006.06.11
Есть ли тут кто-нибудь из Димитровграда?


4-1139742902
Sulimxar
2006-02-12 14:15
2006.06.11
Слежение за разрешением монитора


1-1146860897
eselista
2006-05-06 00:28
2006.06.11
кодинг для КПК


4-1142616099
Наиль
2006-03-17 20:21
2006.06.11
Как узнать имя альтернативного потока данных NTFS?


6-1139150890
ZeFiR
2006-02-05 17:48
2006.06.11
Отображение WML документов?