Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
 Аватар для virtuos553
49 / 4 / 0
Регистрация: 18.12.2012
Сообщений: 247
Записей в блоге: 1

Найти наибольший прямоугольник в матрице состоящий из четных чисел

18.01.2014, 22:47. Показов 3591. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана матрица натуральных чисел. Найти наибольший прямоугольник в матрице состоящий из четных чисел.

исходная матрица хранится в файле input.txt
файл имеет такую структуру:
m n
a_11 .. a_1n
...
a_m1 .. a_mn

Прямоугольную матрицу нужно записать в файл output.txt
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2014, 22:47
Ответы с готовыми решениями:

Найти наибольший прямоугольник в матрице состоящий из четных чисел
Дана матрица натуральных чисел. Найти наибольший прямоугольник в матрице состоящий из четных чисел.

В матрице найти наибольший прямоугольник состоящий из четных чисел
в матрице найти наибольший прямоугольник состоящий из четных чисел. До этого несколько раз создавал тему, никто так и не смог написать...

В матрице из 0 и 1 найти наибольший по площади прямоугольник, состоящий из одних единиц
Дана матрица, состоящая из нулей и единиц. Найти наибольший по площади прямоугольник, состоящий из одних единиц. Реализовать в виде...

9
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
19.01.2014, 00:56
Цитата Сообщение от virtuos553 Посмотреть сообщение
Дана матрица натуральных чисел. Найти наибольший прямоугольник в матрице состоящий из четных чисел.

исходная матрица хранится в файле input.txt
файл имеет такую структуру:
m n
a_11 .. a_1n
...
a_m1 .. a_mn

Прямоугольную матрицу нужно записать в файл output.txt
Ну, я думаю проблем с чтением из файла нет?!) Если есть, то вот, к примеру, Click me!
А так всё очень просто Используете
C++
1
vector <vector <int> > myMatrix(m, vector <int> (n, 0);
, так проще будет, но можно и так
C++
1
int * myMatrix = (int*) malloc(m*n*sizeof(int));
Далее для простоты можете создать еще один такой массив типа bool, а затем рекурсивно проверяете числа в матрице на точность, отмечая проверенные во втором массиве, только рекурссивная функция должна проверять рядом стоящие числа от текущее позиции и считать сколько просчитала уже, а координаты центра запуска (пусть это будет левый верхний угол например) и обнаруженного размера записывать в еще один массив, например) Потом в этом массиве находите наибольшее число, смотрите координаты его угла, а далее вывод с проверкой на четность, как только в строке следующее число нечетное переходите к началу новой с позицией по горизонтали как у первой)
0
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
19.01.2014, 01:06
Вот рисунок сделал, чтобы понятнее было (рекурсивная функция вызывается в цикле для каждого элемента матрицы, если он false в массиве маски)


Можно, конечно, и с помощью стека сделать, но рекурсией проще, вроде)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.01.2014, 23:15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <vector>
 
 
 
struct rectangle {
   size_t left ;
   size_t top ;
   size_t right ;
   size_t bottom ;
   rectangle ( size_t left_, size_t top_ , size_t right_, size_t bottom_ ) : left(left_) , top (top_) , right (right_) , bottom(bottom_) {
   }
} ;
 
 
 
size_t square ( const rectangle & rect ) {
   return ( ( rect.right - rect.left ) + 1 ) * ( ( rect.bottom - rect.top ) + 1 ) ;
}
 
 
template < typename T1 , typename T2 >
rectangle gr ( const std::vector < std::vector < T1 > > & matrix, size_t left , size_t top , const T2 & predicate ) {
   rectangle maxRect ( 0 , 0 , 0 , 0 ) ;
   size_t width = 0  ;
   for ( size_t i = top , height = matrix.size() ; i < height ; ++i ) {
      width = width ? width : matrix[i].size() ;
      for ( size_t j = left ; j < matrix[i].size() &&  j < width ; ++j ) {
         if ( !predicate(matrix [i][j]) ) {
            width = j ;
            if ( j == left )
               return maxRect ;
         } else {
            rectangle rect ( left , top , j ,  i  ) ;
            if ( square(rect) > square(maxRect) )
               maxRect = rect ;
         }
      }
   }
   return maxRect ;
}
 
 
template < typename T >
bool isEven ( const T & first ) {
   return !(first & 1) ;
}
 
 
int main ( ) {
   std::vector < std::vector < int > > matrix
   {
         { 2 , 1 , 4 , 5 , 5 } ,
         { 6 , 6 , 8 , 8 , 8 } ,
         { 7 , 4 , 2 , 8 , 6 } ,
         { 2 , 1 , 8 , 1 , 7 } ,
         { 7 , 7 , 7 , 7 , 7 }
   } ;
   rectangle maxRect ( 0 , 0 , 0 , 0 ) ;
   for ( size_t i = 0 , height = matrix.size() ; i < height ; ++i ) {
      for ( size_t j = 0 , width = matrix[i].size() ; j < width ; ++j ) {
         rectangle rect ( gr ( matrix , j , i , isEven<int> ) ) ;
         if ( square(rect) > square(maxRect) )
            maxRect = rect ;
      }
   }
   std::cout << "( " << maxRect.left << " , " << maxRect.top << " ) - ( " << maxRect.right << " , " << maxRect.bottom << " ) : " << square(maxRect) <<std::endl ;
}
2
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
25.01.2014, 23:23
Croessmah, как понять вывод результата? (С кодом не разбирался)
( 1 , 1 ) - ( 4 , 2 ) : 8 ?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.01.2014, 23:30
Цитата Сообщение от gromo Посмотреть сообщение
Croessmah, как понять вывод результата?
в первой скобке индексы левого верхнего элемента прямоугольника, во второй скобке индекс правого нижнего элемента прямоугольника, после двоеточия площадь прямоугольника:
Название: cyberforum_matrix.png
Просмотров: 114

Размер: 3.4 Кб

P.S. Могут быть баги, куда ж без них то
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.01.2014, 23:48
Исправил некоторые ошибки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <vector>
#include <utility>
 
 
struct rectangle {
   size_t left ;
   size_t top ;
   size_t right ;
   size_t bottom ;
   rectangle ( size_t left_, size_t top_ , size_t right_, size_t bottom_ ) : left(left_) , top (top_) , right (right_) , bottom(bottom_) {
   }
} ;
 
 
 
size_t square ( const rectangle & rect ) {
   return ( ( rect.right - rect.left ) + 1 ) * ( ( rect.bottom - rect.top ) + 1 ) ;
}
 
 
template < typename T1 , typename T2 >
std::pair < rectangle , bool > gr ( const std::vector < std::vector < T1 > > & matrix, size_t left , size_t top , const T2 & predicate ) {
   rectangle maxRect ( 0 , 0 , 0 , 0 ) ;
   bool flag = false ;
   size_t width = 0  ;
   for ( size_t i = top , height = matrix.size() ; i < height ; ++i ) {
      width = width ? width : matrix[i].size() ;
      for ( size_t j = left ; j < matrix[i].size() &&  j < width ; ++j ) {
         if ( !predicate(matrix [i][j]) ) {
            width = j ;
            if ( j == left )
               return {maxRect,flag} ;
         } else {
            rectangle rect ( left , top , j ,  i  ) ;
            if ( square(rect) >= square(maxRect) ) {
               maxRect = rect ;
               flag = true ;
            }
         }
      }
   }
   return {maxRect,flag} ;
}
 
 
template < typename T >
bool isEven ( const T & first ) {
   return !(first & 1) ;
}
 
//Добавил еще один предикат для проверки
template < typename T >
bool isEight ( const T & first ) {
   return first == 8 ;
}
 
 
 
template < typename T1 , typename T2 >
std::pair < rectangle , bool > find(const std::vector < std::vector < T1 > > & matrix, const T2 & predicate){
   rectangle maxRect ( 0 , 0 , 0 , 0 ) ;
   bool flag = false ;
   for ( size_t i = 0 , height = matrix.size() ; i < height ; ++i ) {
      for ( size_t j = 0 , width = matrix[i].size() ; j < width ; ++j ) {
         std::pair <rectangle,bool> pr (gr ( matrix , j , i , predicate ));
         rectangle rect ( pr.first ) ;
         if ( square(rect) >= square(maxRect) && pr.second ) {
            maxRect = rect ;
            flag = true ;
         }
      }
   }
   return {maxRect,flag} ;
}
 
int main ( ) {
   std::vector < std::vector < int > > matrix
   {
         { 1 , 1 , 1 , 1 , 5 } ,
         { 8 , 8 , 8 , 2 , 1 } ,
         { 8 , 8 , 8 , 4 , 1 } ,
         { 1 , 8 , 8 , 6 , 7 } ,
         { 7 , 7 , 4 , 4 , 7 }
   } ;
 
   std::pair <rectangle,bool> pr (find ( matrix , isEven<int> ));
   if ( pr.second ) {
      std::cout << "( " << pr.first.left << " , " << pr.first.top << " ) - ( " << pr.first.right << " , " << pr.first.bottom << " ) : " << square(pr.first) <<std::endl ;
   } else {
      std::cout << "not found" << std::endl ;
   }
}
1
25 / 25 / 12
Регистрация: 04.01.2014
Сообщений: 91
26.01.2014, 00:36
virtuos553, Нужно написать функцию, в которую передавать саму матрицу и индексы-вершины прямоугольника, который нужно "проверить". Функция проверяет каждый элемент прямоугольника на четность, начиная с СЕРЕДИНЫ! и так далее, по спирали. Границы проверяются в последнюю очередь.
Если был найден нечетный элемент, вернуть номер строки и столбца, в которой его нашли.
если нечетного элемента нет, значит проверяемый прямоугольник - хороший

Ну а теперь действуем так:
Сперва проверяем всю матрицу с помощью написанной функции. Если внутри матрицы найден нечетный элемент, то добавляем в очередь (знаете, что такое очередь?:-) ) 4 самых больших прямоугольника, которые не содержат найденного нечетного элемента. Причем добавляем мы в очередь именно в порядке убывания площадей (или как мы сравниваем прямоугольники) - сначала добавим самый большой, потом поменьше итп.
Короче, у нас есть цикл:
пока очередь не пуста,
извлекаем из очереди прямоугольник.
Если он проходит проверку, мы нашли!!!!!
Если нет, то он распадается на 4 прямоугольника поменьше, которые мы добавляем в очередь в порядке убывания площадей.

Не думаю, что существует алгоритм, работающий быстрее + этот алгоритм не требует использования доп. памяти.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
26.01.2014, 01:09
Croessmah, нафига в твоём коде нужны шаблоны?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
26.01.2014, 01:22
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
нафига в твоём коде нужны шаблоны?
чтобы были
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2014, 01:22
Помогаю со студенческими работами здесь

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

В матрице найти наибольший квадрат состоящий из единиц
Задание: В матрице найти наибольший квадрат состоящий из едениц. Сама матрица состоит из 1 и 0. Помогите пожалуйста uses crt; var...

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

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

Высчитать наибольший по площади прямоугольник, состоящий из единиц и подсветить (выделить) его
3. Задан двумерный массив, состоящий из нулей и единиц. Необходимо высчитать наибольший по площади прямоугольник, состоящий из единиц и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru