![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перебор возможных вариантов [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)