Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перебор уникальных строк в матрице 
:(
    Опции темы
TP@MB@Y
Дата 29.10.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Вобщем на входе есть матрица, например вот такая:


0 1 0 0 1
0 0 0 1 0
1 0 0 0 0
1 0 0 0 1
0 0 0 0 1


на выходе мне нужно получить все возможные вектора, содержащие номера столбцов с единицами.

т.е. в данном случае это будут:

(2 4 1 1 5),  (5 4 1 1 5),  (2 4 1 5 5),  (5 4 1 5 5)

для этого я написал рекурсию, но она почемуто неработает
вот сам код (алгоритм) рекурсии (на паскале)

Код

procedure akkap(m:МАТРИЦА;var v:ВЕКТОР;x,y:КООРДИНАТЫ НАЧАЛА ВЫЧИСЛЕНИЙ);
 var i,j:integer;
     first:boolean;
     temp:МАТРИЦА;
 begin
  for i:=y to РАЗМЕР_МАТРИЦЫ_ПО_ВЕРТИКАЛИ do begin
      first:=true;
      for j:=x to РАЗМЕР_МАТРИЦЫ_ПО_ГОРИЗОНТАЛИ do
          if (m[j,i]<>0) and first then begin
             v[i]:=j;
             first:=false
          end
          else if m[j,i]<>0 then akkap(m,v,j,i)
 end;


Может рекурсия не самый лучшый выход для решения этой задачи?

Это сообщение отредактировал(а) TP@MB@Y - 29.10.2006, 17:24
PM   Вверх
TP@MB@Y
Дата 30.10.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Попробую перефразировать задачу.
Нужны все варианты этой матрицы чтобы по строкам было не более одной единицы.
PM   Вверх
anwe
Дата 30.10.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



А в матрице только нули и единицы? Если да, то стоит проссумировать строки. Если реузльтат 1 - это та строка, которая подходит.
PM MAIL   Вверх
TP@MB@Y
Дата 31.10.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



anwe,  ну это понятно. но мне надо все варианты матриц, в которых не более одной единицы на строке.
PM   Вверх
ivashkanet
Дата 31.10.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(TP@MB@Y @  29.10.2006,  14:48 Найти цитируемый пост)
на выходе мне нужно получить все возможные вектора, содержащие номера столбцов с единицами.

Что-то я нифигачего не понимаю  smile 
Что значит все возможные? Столбец либо содержит 1 либо нет smile 
Цитата(TP@MB@Y @  29.10.2006,  14:48 Найти цитируемый пост)
(2 4 1 1 5)

откуда получился 1 столбец? И почему он дважды?
P.S. Можно поподробнее? Как для тупого smile (но не сильно  smile )
PM MAIL WWW ICQ   Вверх
TP@MB@Y
Дата 31.10.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



ivashkanet,  вобщем если перейти от абстракции, то я вычисляю все возможные аппликатуры аккорда(на интервале 5 ладов).
Т.е. есть шесть струн (строк) и пять столбцов(ладов). Аккорд состоит из нот. В этой матрице содержится элементы - ноль если нота не принадлежит аккорду и 1 если принадлежит. Вот мне и надо перебрать все возможные варианты ;)

Думаю теепрь все встало на свои места. Какие предложения?
PM   Вверх
anwe
Дата 1.11.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



TP@MB@Y, ну ты прикинь. Это же 5^6=15625 вариантов.
Может лучше на гитаре. smile  Ведь все равно аккорды и 5 нот встречаются редко, к тому же, если у тебя две или более нот стоят рядом, как то до-ре(-ми), то получается совсем не красиво. smile 
PM MAIL   Вверх
TP@MB@Y
Дата 1.11.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



anwe,  я же пример привел в начале smile там всего 4 варианта для данной матрицы.

вот дана матрица такая - 

0 1 0 0 1
0 0 0 1 0
1 0 0 0 0
1 0 0 0 1
0 0 0 0 1


нужно на выходе получить такие матрицы - 

0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
1 0 0 0 0
0 0 0 0 1



0 0 0 0 1
0 0 0 1 0
1 0 0 0 0
1 0 0 0 0
0 0 0 0 1



0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
0 0 0 0 1
0 0 0 0 1



0 0 0 0 1
0 0 0 1 0
1 0 0 0 0
0 0 0 0 1
0 0 0 0 1


smile

вот я и хочу спросить оптимальный алгоритм как эти варианты перебрать.
написал рекурсивную функцию. но оа где то не срабатывает.
PM   Вверх
Kuvaldis
Дата 1.11.2006, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 1
Всего: 61



TP@MB@Y, 
рекурсия здесь  не нужна. Она была бы нужна, если необходимо было бы выбрать такое расположение, чтобы в СТОЛБЦАХ не было повторений (как в задаче о 8 ферзях)
здесь же очевидное решение.
6 циклов по каждой строке (струне)
Но если очень уж хочется рекурсией, да и мало ли, ты для пианино программу захочешь разработать smile 
Идея: нашли первую ненулевую позицию в струне - идем дальше вниз и повторяем все то же самое
Код

program Project2;

{$APPTYPE CONSOLE}
uses
  SysUtils;

const
    N = 6;
    M = 5;

type
    matr = array [1..N, 1..M] of integer;
    vector = array[1..N] of integer;
//******************************************************************************
procedure PrintVector(v : vector);
var
  i : integer;
begin
  for i := 1 to N do
     write(v[i] : 3);
  writeln;   
end;
//******************************************************************************
procedure akkap(A : matr; n, m, depth : integer; var res : vector);
var
  i : integer;
begin
  if (depth > n) then
  begin
      PrintVector(res);
      Exit;
  end;
  for i := 1 to m do
  begin
      if ( A[depth, i] = 1 ) then
      begin
          res[depth] := i;
          akkap(A, n, m, depth + 1, res);
          res[depth] := 0;
      end;  
  end;
end;  
//******************************************************************************
var
    A : matr = ( ( 0, 1, 0, 0, 1 ),
              ( 0, 0, 0, 1, 0 ),
              ( 1, 0, 0, 0, 0 ),
              ( 1, 0, 0, 0, 1 ),
              ( 0, 0, 0, 0, 1 ),
              ( 0, 0, 0, 0, 1 ) );
                 
    res : vector = (0, 0, 0, 0, 0, 0);
begin

    akkap(A, N, M, 1, res);
    readln;
    readln;
end.
//-----------------------------------------------------------------------------



В векторе res содержатся номера столбцов(лады) для каждой струны.
P.S. Тебе еще имхо нужно будет продумать ситуацию про открытые струны
P.P.S. Есть отличнейшая программулина - Guitar Pro называется. Там это все есть + куча табулатур

Кстати, примеры у тебя какие то странные, ты говоришь про матрицу 6 на 5, а примеры все 5х5

Это сообщение отредактировал(а) Kuvaldis - 1.11.2006, 22:30


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 2.11.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Kuvaldis,  БОЛЬШУЩЕЕ СПАСИБО! smile
Просто я забыл как правильно рекурсии писать)
Вся прелесть рекурсий, в их минимализме smile

Я воспользовался Вашей функцией, немного поправв ее под себя. Спасибо. Работает.

Про гитар про я знаю конечно же. Но программу пишу спецально для себя, с узконаправлеными свойствами. Гитарпро слишком перегружена имхо. 

smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.