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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2011, 19:39   #1
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
Вопрос Рекурсия. Перебор всевозможных вариантов элементов матрицы

Я работаю над небольшим проектом и не могу справится с алгоритмом. Дело в том что я оч хреново использую рекурсию на практике...
Собственно что мне нужно:
Имеется матрица NxM ее элементы могут принимать значение 0 или 1 (ну типа byte). Процедура должна перебрать все возможные варианты значений всех элементов. Как я сам понял это реально сделать тока через рекурсию(ну или по крайней мере мне кажется что это наиболее простой вариант).

Примерчик:
Имеется матрица 2х2, все варианты:
0 0 | 0 0 | 0 0 | 0 0 | 0 1 | 0 1 | 0 1 | 0 1
0 0 | 0 1 | 1 0 | 1 1 | 0 0 | 0 1 | 1 0 | 1 1

1 0 | 1 0 | 1 0 | 1 0 | 1 1 | 1 1 | 1 1 | 1 1
0 0 | 0 1 | 1 0 | 1 1 | 0 0 | 0 1 | 1 0 | 1 1
Каждый вариант, не должен где то хранится, но можно и так) Вообще процедура должна просто перебирать их.

Если вдруг возникнут какие то проблемы с матрицами, можно сделать процедуру перебирающую елементы одномерного массива с такими же элементами, соответственно его длина будет MxN

Если не трудно, оставляйте подробные комментарии. Заранее очень благодарен.

Последний раз редактировалось Mr_freeman; 02.03.2011 в 19:42.
Mr_freeman вне форума Ответить с цитированием
Старый 02.03.2011, 19:54   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

вариант конечно не супер но
for (int i=0; i<2; i++)
for (int j=0; j<2; j++)
for (int k=0; k<2; k++)
for (int l=0; l<2; l++)
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 19:56   #3
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

Можно простую рекурсивную перестановку сделать как для одномерного массива размером n*m, но при каждом след i = n * m на 1 добавляем

Последний раз редактировалось Летучий_СкилетиК; 02.03.2011 в 20:11.
Летучий_СкилетиК вне форума Ответить с цитированием
Старый 02.03.2011, 19:58   #4
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

onewho, я в делфи делаю...
Летучий скелетик, можно поподробнее??
Mr_freeman вне форума Ответить с цитированием
Старый 02.03.2011, 20:01   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

омг, ну
i,j,k,l:integer;
for i:=0 for i<=1
for j:=0 for j<=1
for k:=0 for k<=1
for l:=0 for l<=1
writeln(i,' ',j,' ',k,' ',l);
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 20:10   #6
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

onewho, в делфи никогда не видел чтоб так делали, но как я понял ты написал только для моего примера, то есть перебор 4-ех елементов. а процедура должна делать это для люього их количества..(
Mr_freeman вне форума Ответить с цитированием
Старый 02.03.2011, 20:13   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

да... тогда косяк.
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 20:15   #8
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

пределы n и m какие?
Цитата:
Можно простую рекурсивную перестановку сделать как для одномерного массива размером n*m, но при каждом след i = n * m на 1 добавляем
если больше чем 10 то стршно как долго будет!
Летучий_СкилетиК вне форума Ответить с цитированием
Старый 02.03.2011, 20:31   #9
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Скилетик, я про рекурсию вообще мало знаю, ты можешь код выложить сюда??
Насчет границ ничего сказать не могу но я сам уже догадался что про больших ЭМ и ЭН это ппц..
Mr_freeman вне форума Ответить с цитированием
Старый 02.03.2011, 20:35   #10
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

Код:
uses crt;
type
    mass=array [byte] of byte;
var
   x:mass;
   j,n,m,nn,mm,l:byte;
   g:boolean;
procedure mnog(var x:mass;var g:boolean);
var
   i:byte;
begin
      i:=n;
      while (i>0)and(x[i]=m)do
      begin
           x[i]:=1;
           i:=i-1;
      end;
      if i>0 then begin x[i]:=x[i]+1;g:=true;end
      else g:=false;
end;
begin
clrscr;
readln(nn,mm);
n:= nn* mm;
m:=2;
for j:=1 to n do
x[j]:=1;
g:=true;
         repeat
               mnog(x,g);
                   l:=0;
                   for j:=1 to n do
                   begin
                       l:=l+1;
                       write(x[j]-1,' ');
                       if l = mm then begin writeln; l:=0;end;
                   end;
                writeln;
         until g=false;
readkey;
end.
с сортировкой это я перегнул, вот на основе сожитания с добавлением....

Последний раз редактировалось Летучий_СкилетиК; 02.03.2011 в 20:45.
Летучий_СкилетиК вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор всех возможных вариантов phenix Помощь студентам 3 03.12.2010 21:29
Сумма четных элементов матрицы. Произведение элементов 3-го столбца. Минимальный элемент матрицы. renovare Помощь студентам 2 03.07.2009 21:13
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17
Перебор вариантов... или что-то такое elsin Общие вопросы Delphi 3 15.01.2009 22:13
Перебор элементов матрицы pikkk Общие вопросы Delphi 3 09.05.2008 14:45