Ребят помогите, код и желательно описание идеи алгоритма !
В двумерном целочисленном массиве размерностью n * m элементы приобретают только натуральных значений. Прямоугольником в массиве считать группу соседних элементов одного значения, которые вместе образуют прямоугольник размером k * l (k> 1, l> 1). прямоугольником нельзя считать группу элементов, принадлежию другому прямоугольнику. Вычислить количество прямоугольников в заданном массиве.
Другие языки программирования и технологии
Помогите решить задачку
Интересная задача, но возможно где и решалась.
Думаю надо рекурсивный алгоритм здесь применять или подобие его.
Для массива n на m элементов предусмотреть, что элементы можно помечать int-м номером, типа номер прямоугольника будет. В начале все 0 - то бишь нет прямоугольника.
Начинаем условно с верхнего левого элемента и определяем прямоугольник.
Для начала определяем есть ли справа (если не превышена размерность) , снизу (если не превышена размерность) такое же натуральное значение, ну и вниз вправо еще одну ячейку.
Это будет минимальный допустимый прямоугольник. Дальше уже надо двигаться вправо и вниз по крайним и вычислять стороны этого прямоугольника, если сторона меньше ранее найденной на прошлом шаге, то стоп (а то это уже и не прямоугольник будет) . По точка которые нашли: начальная, крайняя правая и крайняя нижняя можно пометить все внутри как принадлежащие прямоугольнику 1 и увел. счетчик прямоугольников.
Далее ищем по порядку следующую точку у которой пометка 0 - и проверяем все как выше написано.
Если жестко задано k на l и только один одного такого типа, то все бы упростилось.
Думаю надо рекурсивный алгоритм здесь применять или подобие его.
Для массива n на m элементов предусмотреть, что элементы можно помечать int-м номером, типа номер прямоугольника будет. В начале все 0 - то бишь нет прямоугольника.
Начинаем условно с верхнего левого элемента и определяем прямоугольник.
Для начала определяем есть ли справа (если не превышена размерность) , снизу (если не превышена размерность) такое же натуральное значение, ну и вниз вправо еще одну ячейку.
Это будет минимальный допустимый прямоугольник. Дальше уже надо двигаться вправо и вниз по крайним и вычислять стороны этого прямоугольника, если сторона меньше ранее найденной на прошлом шаге, то стоп (а то это уже и не прямоугольник будет) . По точка которые нашли: начальная, крайняя правая и крайняя нижняя можно пометить все внутри как принадлежащие прямоугольнику 1 и увел. счетчик прямоугольников.
Далее ищем по порядку следующую точку у которой пометка 0 - и проверяем все как выше написано.
Если жестко задано k на l и только один одного такого типа, то все бы упростилось.
Описание примерно такое.
Договоримся, что будем помечать отрицательными числами уже найденные прямоугольники.
Тогда нам нужен двойной цикл, который будет выбирать первый элемент прямоугольника. При этом если элемент отрицательный, то идем на следующую итерацию.
А внутри цикла мы будем проверять, есть прямоугольник или нет. Минимальный у нас 2х2 ну и далее до конца массива. Если прямоугольник обнаружен, увеличиваем счетчик и меняем все найденные элементы на отрицательные. Тут есть только один хитрый момент: прямоугольники надо искать в последовательности 2х2, 2х3, 3х2, 3х3, 2х4, 4х2, 3х4, 4х3... -а простой двойной цикл даст нам 2х2, 3х2, 4х2, 5х2...,что в корне неверно. Поэтому тут надо действовать нескольно умнее - подумай. Удачи.
Договоримся, что будем помечать отрицательными числами уже найденные прямоугольники.
Тогда нам нужен двойной цикл, который будет выбирать первый элемент прямоугольника. При этом если элемент отрицательный, то идем на следующую итерацию.
А внутри цикла мы будем проверять, есть прямоугольник или нет. Минимальный у нас 2х2 ну и далее до конца массива. Если прямоугольник обнаружен, увеличиваем счетчик и меняем все найденные элементы на отрицательные. Тут есть только один хитрый момент: прямоугольники надо искать в последовательности 2х2, 2х3, 3х2, 3х3, 2х4, 4х2, 3х4, 4х3... -а простой двойной цикл даст нам 2х2, 3х2, 4х2, 5х2...,что в корне неверно. Поэтому тут надо действовать нескольно умнее - подумай. Удачи.
на каком языке нужен код?
Похожие вопросы
- Помогите решить задачку простенькую.
- помогите решить задачку, на VBA для Excel
- Кто разбирается в программировании? помогите решить задачку!
- Пожалуйста, помогите решить задачку по информатике...
- Люди помогите решить задачку!!!на паскале
- Знатоки Турбо Паскаля, помогите решить задачки для 7-го класса. Дочке очень нужно.
- помогите решить задачку по информатике
- Помогите решить задачку по информатике!
- Господа программеры. Я знаю что вы добрые люди. Не поможете решить задачку?
- Помогите решить задачку.