Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2011, 23:56   #1
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Вопрос Комбинаторика - нахождение всех возможных комбинаций

Есть 4 числа: 1, 2, 3, 4. Нужно узнать все возможные комбинации из этих 4-х чисел в числе, состоящем из N знаков.

Например если число пятизначное, то чтобы узнать все комбинации, нужно сделать пять вложенных циклов от 1 до 4. А если число знаков в числе неизвестно заранее и оно может изменяться от 1 и до бесконечности (грубо говоря). Как в таком случае вычислить все комбинации?

В результате получается 4 в степени N возможных вариантов, где N - число знаков в числе.
лучший подарок женщине-программисту

Последний раз редактировалось chandrasecar; 31.03.2011 в 23:58.
chandrasecar вне форума Ответить с цитированием
Старый 01.04.2011, 01:01   #2
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Поиск - великая вещь...
Код:
procedure generate(l, r: Integer; var k: longint);
var
  i, v: Integer;
begin
  if (l = r) then
  begin
    for i := 1 to n do
      write(a[i], ' ');
    writeln;
    k := k + 1;
  end
  else
  begin
    generate(l + 1, r, k); { вызов новой генерации }
    for i := l + 1 to r do
    begin
      v := a[l];
      a[l] := a[i];
      a[i] := v; { обмен a[i],a[l] }
      generate(l + 1, r, k); { вызов новой генерации }
    end;
    v := a[l];
    for i := l to r - 1 do
      a[i] := a[i + 1];
    a[r] := v;
  end;
end;
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 01.04.2011, 08:22   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

я делал так http://programmersforum.ru/showthread.php?t=138096
phomm вне форума Ответить с цитированием
Старый 01.04.2011, 09:11   #4
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Цитата:
Поиск - великая вещь...
http://www.cyberforum.ru/pascal/thread188474.html
Код:
{генерация перестановок }
uses crt;
const n = 4; { количество элементов в перестановке}
var a:array[1..n] of integer;
    j:integer;{счетчик}
    kol : longint;{количество перестановок}
procedure generate (l,r:integer;var k:longint);
var i,v:integer;
begin
if (l=r) then
  begin
    for i:=1 to n do write(a[i],' ');
    writeln;
    k:=k+1;
  end
else
  begin
    for i := l to r do
      begin
        v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[l]}
        generate(l+1,r,k); {вызов новой генерации}
        v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[l]}
      end;
  end;
end;
begin
clrscr;
for j := 1 to N do
a[j]:=j;
generate( 1,n,kol);
writeln('kol=',kol);
readln
end.
И как это сделать в Дельфи? Например с ЛистБоксом и выводом всех вариантов решения?
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 01.04.2011, 09:47   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
И как это сделать в Дельфи? Например, с ЛистБоксом и выводом всех вариантов решения?
дык достаточно заменить вывод в процедуре generate:
Код:
procedure generate (l,r:integer;var k:longint);
var i,v:integer;
     s : string;
begin
if (l=r) then
  begin
    s := '';
    for i:=1 to n do s := s + IntToStr(a[i])+' ';
    ListBox1.Items.Append(s); 
    k:=k+1;
  end
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2011, 10:40   #6
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Спасибо. Я свой алгоритм написал, все устраивает.
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 01.04.2011, 13:59   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Уважаемый chandrasecar, ну покажите уж, что сделали. У нас так заведено. Решил задачу - покажи как.
Тем более
Цитата:
Я свой алгоритм написал
так еще интересней
Sibedir вне форума Ответить с цитированием
Старый 01.04.2011, 23:30   #8
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Цитата:
Уважаемый chandrasecar, ну покажите уж, что сделали. У нас так заведено. Решил задачу - покажи как.
Само собой. Наверняка можно и лучше сделать. Но тоже рабочий вариант. Если заранее неизвестно сколько цифр в наборе и каков их состав:

Код:
  
  combi:='';
  MainForm.ListBox1.Clear;
  for i:=1 to n do  //n-максимальная длина, тип Integer
    combi:=combi+s; //s-максимальное число тип Char. переменная combi строкового типа. например если нужно узнать сколько комбинаций в пятизначном числе (переменная n=5) состоящей из чисел от 0 до 3, то s='3';
  for i:=0 to StrToInt(combi) do begin
    a:=0;
    for j:=1 to Length(IntToStr(i)) do begin
      if (StrToInt(IntToStr(i)[j]) in [0..StrToInt(s)]) then a:=a+1;
    end;
    if a=Length(IntToStr(i)) then MainForm.ListBox1.AddItem(IntToStr(i),nil); // в ListBox1 записываем результат
  end;
Минус в том, что чем длиннее комбинация тем дольше считает. Например на пятизначную комбинацию состоящей из чисел от 0 до 3 тратиться время в несколько секунд. Этот код максимально подходит под мои личные задачи.
лучший подарок женщине-программисту

Последний раз редактировалось chandrasecar; 01.04.2011 в 23:34.
chandrasecar вне форума Ответить с цитированием
Старый 04.04.2011, 04:28   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Например на пятизначную комбинацию состоящей из чисел от 0 до 3 тратиться время в несколько секунд
Не мудренно
Цитата:
Код:
if (StrToInt(IntToStr(i)[j]) in [0..StrToInt(s)]) then a:=a+1;
Цитата:
Наверняка можно и лучше сделать
Особо не вникал, но сразу навскидку могу посоветовать потратить пару лишних байт на локальные переменные. Скорость возрастет значительно.
Код:
  s1 := IntToStr(i);
  i1 := StrToInt(s);
  for j:=1 to Length(IntToStr(i)) do begin
    if (ord(s1[j]) in [0..i1]) then a:=a+1;
  end;
Sibedir вне форума Ответить с цитированием
Старый 09.04.2012, 21:06   #10
Helen236
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 23
По умолчанию

Код:
uses crt;
const n = 4; { количество элементов в перестановке}
var a:array[1..n] of integer;
    j:integer;{счетчик}
    kol : longint;{количество перестановок}
procedure generate (l,r:integer;var k:longint);
var i,v:integer;
begin
if (l=r) then
  begin
    for i:=1 to n do write(a[i],' ');
    writeln;
    k:=k+1;
  end
else
  begin
    for i := l to r do
      begin
        v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[l]}
        generate(l+1,r,k); {вызов новой генерации}
        v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[l]}
      end;
  end;
end;
begin
clrscr;
for j := 1 to N do
a[j]:=j;
generate( 1,n,kol);
writeln('kol=',kol);
readln
end.
Что нужно изменить если дана строка символов (и числа и цифры)????
Helen236 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комбинаторика. Получение возможных вариантов. Alex Cones Общие вопросы Delphi 3 16.01.2011 13:52
Перебор возможных комбинаций в матрице N*N Руслан_911 Помощь студентам 3 25.11.2010 20:35
Перебор возможных комбинаций символов Toxask8 Общие вопросы C/C++ 1 12.12.2009 21:33
сортировка данных (пересчет возможных вариантов комбинаций, перенос данных в таблицу) Vitalik85 Microsoft Office Excel 4 12.08.2009 00:30