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

Вниз

Дана матрица   Найти похожие ветки 

 
Matrixxx   (2003-12-09 18:17) [0]

Мастера, please, помогите! :-<
Дана матрица 4*4 (n*n).
Например:
0 0 3 0
0 0 0 0
4 0 0 0
2 0 0 0
Необходимо найти максимальную размерность входящей матрицы из нулей (в данном примере: 3).
Нужна только мысль, или же алгоритм (сегодня же...). На Delphi переведу потом сам.
Буду очень признателен.


 
Тимохов   (2003-12-09 18:22) [1]

1. Бежишь по каждой клетке (двумя вложенными циклами).
2. Для каждой клетки делаешь цикл (*). В этом цикле сначала см. подматрицу (тоже двумя циклами) вправо и вниз размерности 1х1, затем, 2х2 и т.д. если матрица ненулевая, то прекращаешь цикл (*), запоминаешь какой разметрности была матрица, переходишь к следующей клетке.
3. Из найденых подматриц, находишь большую размерность.

Все.


 
Sandman25   (2003-12-09 18:28) [2]

Я бы шел с конца. Сначала попытался бы найти матрицу размером n. Если бы не нашел, перешел бы к поиску матрицы n-1 и т.д. Большие матрицы быстрее ищутся, так как кандидатов мало.


 
Adoon   (2003-12-09 18:28) [3]

Если надо найти квадратные подматрицы, то первым в голову пришел такой алгоритм - он не оптимизирован, просто перебор

i := 0; j := 0

1) рассматриваем матрицу размерности m = 1 и с индексами начального элемента i,j
2) если все ее элементы 0, то заносим в спец массив начальные индексы и размерность, иначе переходим на следующий начальный элемент и если матрица не закончилась, то идем на шаг 1, иначе идем на 5 шаг
3) увеличиваем размерность m := m + 1
4) идем на 2 шаг (тут можно немного оптимизировать)
5) пробегаем сформированный массив и находим то, что нам необходимо

(вместо массива, можно использовать переменную, в которую заносить данные о наибольшей найденной на данный момент подматрице)
я мог и немного ошибиться в логике, но смысл уловим
большой минус - экспоненциальная зависимость от размерности матрицы


 
Тимохов   (2003-12-09 18:28) [4]


maxzeromatrix := 0;
for x := 0 to n-1 do
for y := 0 to n-1 do
begin
if m[x,y] = 0 then
begin
s := 1;
kbreak := false;
while not kbreak do
begin
for x1 := x to x+s-1 do
begin
for y1 := y to y+s-1 do
if m[x1, y1] <> 0 then
begin
kbreak := true;
break;
end;
if kbreak then break;
end;
s := s+1;
end;
if s > maxzeromatrix then maxzeromatrix := s;
end;
end;


типа того, может есть ошибки, но в общем верно.


 
Тимохов   (2003-12-09 18:30) [5]

виноват

if s > maxzeromatrix then maxzeromatrix := s;
заменить на
if s-1 > maxzeromatrix then maxzeromatrix := s-1;


 
Тимохов   (2003-12-09 18:32) [6]

даже не так, а
if s-2 > maxzeromatrix then maxzeromatrix := s-2;


 
Тимохов   (2003-12-09 18:38) [7]

а блин, ну типа еще просмотр подматрицы надо ограничить (типа,
for x1 := x to MinInt(n-1, x+s-1) do ....)


 
Matrixxx   (2003-12-09 18:43) [8]

Сейчас проверю.
Спасибо, что откликнулись.


 
Matrixxx   (2003-12-09 19:11) [9]

Ребята!
Если матрица вся из нулей, то тест не проходит.


 
nikkie   (2003-12-09 19:16) [10]

объясни, что такое "входящая матрица"
если столбец i входит, то строчка i обязана входить?


 
Тимохов   (2003-12-09 19:24) [11]

2автор.
Твои слова "На Delphi переведу потом сам.
Буду очень признателен."
Значит ты Д знаешь? Тогда и ошибку сможешь найти.
Привел код, с целью лучше пояснить алгоритм.
Вполне возможно там есть ошибки (не в алгоритме, а в реализации).
В целом верно. Бери как есть.


 
Тимохов   (2003-12-09 19:30) [12]

И вообще, фраза "тест не проходит", просто чудо как информативна.

Куда не проходит?


 
Matrixxx   (2003-12-09 19:32) [13]

Извиняюсь, ошибка уже найдена! Благодарен!


 
Matrixxx   (2003-12-09 19:34) [14]

Я тестировал программу, задавая разные входящие данные... в текстовом файле.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
1-75205
незнайка
2003-12-11 09:41
2003.12.23
DDE сервер и простейший вопрос :)


1-75258
saska
2003-12-10 11:26
2003.12.23
Wizard.


1-75252
Biji
2003-12-10 14:30
2003.12.23
Обновление окна программы


8-75268
help
2003-08-25 12:40
2003.12.23
Изменение экранного разрешения


3-75131
GOGA
2003-11-30 18:38
2003.12.23
непонятно работает UpdateSQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский