Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.04.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
15-1294238628
@!!ex
2011-01-05 17:43
2011.04.17
Синхронизация файлов


2-1295100435
volkafff
2011-01-15 17:07
2011.04.17
Вопросы новичка про цикл и неповторяющиеся числа в массиве.


15-1293831003
Юрий
2011-01-01 00:30
2011.04.17
С днем рождения ! 1 января 2011 суббота


15-1294132538
dimonch-ik
2011-01-04 12:15
2011.04.17
траектория


15-1292840260
ocean
2010-12-20 13:17
2011.04.17
К вопросу о нобелевских премиях





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский