Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перебор двухмерного массива 
:(
    Опции темы
Toska
Дата 16.7.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вопрос такой, допустим я имею двумерный массив 3x3, значение он может принимать только 0 и 1. 
Как осуществить полный перебор возможных вариантов? 
Типа
1 0 0
0 0 0
0 0 0

0 1 0
0 0 0 
0 0 0

и т.д.?
PM MAIL   Вверх
Burka
Дата 16.7.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Наверно легче будет сделать из массива строку, типа такого для первого варианта:
100 000 000
для второго
010 000 000

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


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
greenpc
Дата 17.7.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

var
 aa, i : LongInt;
 razm : integer;

function DecToBinStr(a_bByte: LongInt; Msize, pline : Integer): string;
var
 i: integer;
begin
  Result := '';
  for i := 1 to Msize do
 begin
   Result := chr(Ord('0') + (a_bByte and 1))+result;
   if (Msize mod pline)=0 then result ;=result +#13+#10; // перевод строки
   a_bByte := a_bByte shr 1;
 end;
end;

begin
  write('размерность');
  readln(m,n);
  razm :=m*n;
  aa :=1;
  for i := 1 to razm do aa := aa shl 1; // счтаем кол-во переборов
  for i := 1 to aa-1 do   writeln(DecToBinStr(i, razm, m)); 
end;


Это сообщение отредактировал(а) greenpc - 17.7.2007, 09:00
PM   Вверх
Toska
Дата 17.7.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Наверно легче будет сделать из массива строк

Ну я пока так и сделал. Но у меня массив 9х9 вот и получается.... 81....

Думаю если сделать двумерным по быстрее будет...

Добавлено через 7 минут и 39 секунд
2greenpc 

Чо та не работает..
PM MAIL   Вверх
Toska
Дата 17.7.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Burka, 
Давай процедуру
PM MAIL   Вверх
greenpc
Дата 17.7.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Toska, 
ошибка в кол-ве уникальных строк
не помню я ф-лу кол-ва перестановок в матрице
Код

begin
  write('размерность'); //введи 9 если 3х3
  readln(razm);
  aa :=1;
  for i := 1 to razm do aa := 2*aa; // счтаем кол-во переборов
  for i := 1 to aa-1 do   writeln(DecToBinStr(i, razm, m)); 
end;

aa - выходит за предел longInt;
например для матрицы 5х5 кол-во уникальных перестановок будет 33554432

Это сообщение отредактировал(а) greenpc - 17.7.2007, 12:34
PM   Вверх
Burka
Дата 17.7.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

var R:integer;
... 
procedure P(var A: string; B: string);
 Var
  J: Word;
  C, D: string;
 begin
   { P(N,N) >>  R=Slen  }
if Length(B) = SLen - R then {Здесь делаешь что тебе нужно, 
например подсчет количества вариантов или добавление строки в массив}
{Per++}
 else
 for J := 1 to Length(B) do
  begin
   Application.ProcessMessages;
   C := B;
   D := A + C[J];
   Delete(C, J, 1);
   P(D, C);
  end;
end;



Пример использования, он немного не стандартный. 
так как если у тебя массив 3х3, то тебе нужно иметь 9 единиц и 9 нулей. 
Код

  str:='111111111000000000'; 
  R:= 3 * 3;  // длина строки, которую нам нужно получить
  Q := '';
  P(Q, str);


Только есть два минуса:
Первый - будет очень много повторных строк.
А второй минус -  я так и не дождался пока сгенерируются варианты для матрицы 3х3, время генерации для строки длиной 9 символов 45 сек и получаеться 362880 вариантов. для 18 символов время через чур большим будет.
P.S. Код взят из DelphiWorld и заточен он под перебор разных символов, поэтому не очень подходит.

Это сообщение отредактировал(а) Burka - 17.7.2007, 11:56


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Toska
Дата 17.7.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Наверно легче будет сделать из массива строк

Ну я пока так и сделал. Но у меня массив 9х9 вот и получается.... 81....

Думаю если сделать двумерным по быстрее будет...


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

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

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


 




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


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

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