Текущий архив: 2011.04.17;
Скачать: CL | DM;
Вниз
перебор возможных вариантов Найти похожие ветки
← →
bagos (2011-01-17 08:48) [0]требуется получить массив всех возможных вариантов из n элементов.
входные данные например 0 0 0
нужно получить
000
001
010
011
100
101
110
111
в какую сторону копать?
Заранее спасибо, думаю на эту тему должна быть матчасть, может уже кто реализовывал подобное чтобы велосипед не изобретать?
← →
MBo © (2011-01-17 09:04) [1]приведенный пример - битовое представление чисел от 0 до 7 (в общем случае до 2^n - 1)
← →
И. Павел © (2011-01-17 10:23) [2]Если задача учебная, то лучше написать этот велосипед еще раз.
суть простая: сначала у вас имеется 000. На каждом следующем шаге идете справа налево по массиву. Если встретили нулевой элемент, то заменяете его единицей, а все элементы справа обнуляете и переходите к следующему шагу. Волт и все.
← →
KSergey © (2011-01-17 10:35) [3]> требуется получить массив всех возможных вариантов из n элементов.
А почему элементы только 0 и 1 принимают значения?
← →
bagos (2011-01-17 10:39) [4]спасибо за ответы, И. Павел, не учебная.
Есть около 10 параметров, каждый из которых может быть либо false либо true, собственно нужно -1 и 0, хочу посмотреть как будут изменяться выходные данные, для всех возможных вариантов заданных 10 параметров
← →
bagos (2011-01-17 10:40) [5]И. Павел, по первости тоже такая идея пришла, тупо брать по массиву пройтись, но хотелось бы более элегантное решение, если оно конечно возможно
← →
Сергей М. © (2011-01-17 10:46) [6]> для всех возможных вариантов заданных 10 параметров
> хотелось бы более элегантное решение
for i := 0 to 1023 do.. // в i - очередная комбинация битовых значений из всех 2^10 возможных
Куда уж элегантнее)
← →
Dennis I. Komarov © (2011-01-17 11:01) [7]
> Куда уж элегантнее)for i := 0 to $3FF do..
Вот так ;)
← →
И. Павел © (2011-01-17 11:18) [8]> но хотелось бы более элегантное решение
Ну тогда просто проходите все числа от 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;
← →
bagos (2011-01-17 11:30) [9]спасибо, ваше решение красивее моего
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;
← →
bagos (2011-01-17 11:34) [10]вот конечный под мою задачу, с 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;
Всех благодарю, за советы и комментарии, помогли мне!
← →
Dennis I. Komarov © (2011-01-17 11:50) [11]
> Ну тогда просто проходите все числа от 0 до 2 в степени
> n - 1 (как уже написали) и в цикле вычленяйте разряды через
> mod 2:
Ну не знаю, что там скажет оптимизатор, но решение (X shr N) and $1 мне кажется и нагляднее, и элегантнее
Страницы: 1 вся ветка
Текущий архив: 2011.04.17;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.004 c