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

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

перебор возможных вариантов [D7, XP]


bagos ©   (2011-01-17 08:48:00) 

требуется получить массив всех возможных вариантов из n элементов.
входные данные например 0 0 0
нужно получить
000
001
010
011
100
101
110
111
в какую сторону копать?
Заранее спасибо, думаю на эту тему должна быть матчасть, может уже кто реализовывал подобное чтобы велосипед не изобретать?


Dennis I. Komarov   (2011-01-17 11:50:00) [1]


> Ну тогда просто проходите все числа от 0 до 2 в степени
> n - 1 (как уже написали) и в цикле вычленяйте разряды через
> mod 2:

Ну не знаю, что там скажет оптимизатор, но решение (X shr N) and $1 мне кажется и нагляднее, и элегантнее


bagos   (2011-01-17 11:34:00) [2]

вот конечный под мою задачу, с boolean
var
 k,i,j:integer;
 mass:array of boolean;
 n:integer;
 s:string;
begin
 n := 3;
 setlength(mass,n);
 for i:=0 to n-1 do
   mass[i] := false;
for j:=0 to (n-1)*n+2 do
begin
 s := '';
 for i:=n-1 downto 0 do
   if not mass[i] then
   begin
     mass[i] := true;
     for k:=i+1 to n-1 do
       mass[k] :=  false;
     for k:=0 to n-1 do
       s := s + BoolToStr(mass[k]);
     memo2.Lines.Add(s);
     break;
   end;
end;

Всех благодарю, за советы и комментарии, помогли мне!


bagos   (2011-01-17 11:30:00) [3]

спасибо, ваше решение красивее моего

 k,i,j:integer;
 mass:array of integer;
 n:integer;
 s:string;
begin
 n := 4;
 setlength(mass,n);
 for i:=0 to n-1 do
   mass[i] := 0;
for j:=0 to (n-1)*n+2 do
begin
 s := '';
 for i:=n-1 downto 0 do
   if mass[i] = 0 then
   begin
     mass[i] := 1;
     for k:=i+1 to n-1 do
       mass[k] :=  0;
     for k:=0 to n-1 do
       s := s + inttostr(mass[k]);
     memo2.Lines.Add(s);
     break;
   end;
end;


И. Павел   (2011-01-17 11:18:00) [4]

> но хотелось бы более элегантное решение

Ну тогда просто проходите все числа от 0 до 2 в степени n - 1 (как уже написали) и в цикле вычленяйте разряды через mod 2:

procedure TForm1.Button1Click(Sender: TObject);
var i, j, chislo: integer;
   stroka: string;
begin
 for i := 0 to 15 do
 begin
   stroka := '';
   chislo := i;
   for j := 1 to 4 do
   begin
     stroka := stroka + IntToStr(chislo mod 2);
     chislo := chislo div 2;
   end;
   Memo1.Lines.Add(stroka);
 end;
end;


Dennis I. Komarov   (2011-01-17 11:01:00) [5]


> Куда уж элегантнее)

for i := 0 to $3FF do..
Вот так ;)


Сергей М.   (2011-01-17 10:46:00) [6]

> для всех возможных вариантов заданных 10 параметров
> хотелось бы более элегантное решение

for i := 0 to 1023 do.. // в i - очередная комбинация битовых значений  из всех 2^10 возможных

Куда уж элегантнее)


bagos   (2011-01-17 10:40:00) [7]

И. Павел, по первости тоже такая идея пришла, тупо брать по массиву пройтись, но хотелось бы более элегантное решение, если оно конечно возможно


bagos   (2011-01-17 10:39:00) [8]

спасибо за ответы, И. Павел, не учебная.
Есть около 10 параметров, каждый из которых может быть либо false либо true, собственно нужно -1 и 0, хочу посмотреть как будут изменяться выходные данные, для всех возможных вариантов заданных 10 параметров


KSergey   (2011-01-17 10:35:00) [9]

> требуется получить массив всех возможных вариантов из n элементов.

А почему элементы только 0 и 1 принимают значения?


И. Павел   (2011-01-17 10:23:00) [10]

Если задача учебная, то лучше написать этот велосипед еще раз.
суть простая: сначала у вас имеется 000. На каждом следующем шаге идете справа налево по массиву. Если встретили нулевой элемент, то заменяете его единицей, а все элементы справа обнуляете и переходите к следующему шагу. Волт и все.


MBo   (2011-01-17 09:04:00) [11]

приведенный пример - битовое представление чисел от 0 до 7 (в общем случае до 2^n - 1)


Наверх

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