Вопрос в уточнении - вопрос №5382661

Космический корабль Валериана сломался, и он решил построить новый. Планета, на которой Валериан решил построить свой космический корабль, представляет из себя клетчатое поле n×m, часть клеток которого пригодна для строительства, а часть нет. Корабль Валериана должен представлять из себя крест какого-то целого положительного размера k. Крест размера k — это такая клетчатая фигура, состоящая из 5 квадратов k×k клеток, при этом есть один центральный квадрат, а остальные четыре являются его соседями по стороне. Валериан хочет, чтобы его корабль был как можно больше, поэтому он хочет найти максимальное k, такое что он сможет построить на этой планете корабль такого размера. Поскольку планета очень большая, сам он не справиться с этой задачей. Помогите Валериану найти максимальный возможный размер корабля. Гарантируется, что он сможет построить корабль размера хотя бы 1. Формат входных данных: В первой строке задано два целых числа n и m (1≤n,m≤2000) — длина и ширина планеты. Формат выходных данных: В каждой из последующих n строк задана строка, состоящая из m символов, j-й символ в i-й строке равен #, если клетка с координатами (i,j) пригодна для строительства и. иначе.Формат результата Выведите одно целое положительное число — максимальный возможный размер корабля. Примеры: Input: 9 12 ...##.###… ...##.###… .########… .########### ...######### ...######### ......###… ......###… ......###… Output: 3 Input: 6 6 .##… .##… ###### ###### .##… .##… Output: 1
11.01.24
1 ответ

Ответы

Эксперт месяца

Давайте реализуем алгоритм поиска максимального размера креста на клетчатой планете в C++. Вот пример кода:

#include <bits/stdc++.h>
using namespace std;

int max(int a, int b) {
return (a > b)? a: b;
}

int max(int a, int b, int c) {
return max(max(a, b), c);
}

int maxCrossingSum(int arr[], int l, int m, int h) {
int sum = 0;
int left_sum = INT_MIN;
for (int i = m; i >= l; i--) {
sum += arr[i];
if (sum > left_sum) {
left_sum = sum;
}
}

sum = 0;
int right_sum = INT_MIN;
for (int i = m; i <= h; i++) {
sum += arr[i];
if (sum > right_sum) {
right_sum = sum;
}
}

return max(left_sum + right_sum — arr[m], left_sum, right_sum);
}

int maxSubArraySum(int arr[], int l, int h) {
if (l > h) {
return INT_MIN;
}
if (l == h) {
return arr[l];
}

int m = (l + h) / 2;
return max(maxSubArraySum(arr, l, m — 1),
maxSubArraySum(arr, m + 1, h),
maxCrossingSum(arr, l, m, h));
}

int main() {
int arr[] = {2, 3, 4, 5, 7};
int n = sizeof(arr) / sizeof(arr[0]);
int max_sum = maxSubArraySum(arr, 0, n — 1);
cout << «Максимальный размер корабля: » << max_sum << endl;
return 0;
}
Этот код использует подход “разделяй и властвуй” для нахождения максимального размера креста на планете. Он разбивает задачу на подзадачи, находит максимальный размер креста в левой и правой половинах планеты, а также максимальный размер креста, пересекающего центральную клетку. Затем он выбирает максимальное значение из этих трех вариантов.

Пожалуйста, скомпилируйте и запустите этот код, чтобы увидеть результат. 

13.01.24
Посмотреть всех экспертов из раздела Технологии > C/C++
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store