Нехай координати прямокутників задані наступним чином:
(x_1, y_1) - (x_2, y_2): перший прямокутник, x_1 < x_2, y_1 < y_2,
(x_3, y_3) - (x_4, y_4): другий прямокутник, x_3 < x_4, y_3 < y_4
Розглянемо мінімальний за розмірами прямокутник, який повністю покриває обидва вихідні прямокутники. Позначимо його протилежні кути як (minx, miny) і (maxx, maxy). Тоді:
minx = min(x_1, x_3), miny = min(y_1, y_3),
maxx = max(x_2, x_4), maxy = max(y_2, y_4)
Розміри покриваючого прямокутника рівні:
length = maxx - minx,
width = maxy - miny
Щоб обидва прямокутники можна було повністю покрити квадратом, сторона квадрата повинна бути не меншою як length, так і . Тому довжина сторони мінімального квадратного пасовища рівна максимуму з цих двох величин:
Приклад
Розглянемо два вихідні прямокутники:
перший прямокутник має нижній лівий кут і верхній правий кут ,
другий прямокутник має нижній лівий кут і верхній правий кут
Обчислимо межі результуючого прямокутника:
minx = min(6, 1) = 1, miny = min(6, 8) = 6,
maxx = max(8, 4) = 8, maxy = max(8, 9) = 9
Розміри покриваючого прямокутника рівні:
length = 8 - 1 = 7,
width = 9 - 6 = 3
Довжина сторони покриваючого квадрата становитиме:
Отже, площа мінімального покриваючого квадрата рівна 7^2 = 49.
Реалізація алгоритму
Ініціалізуємо межі покриваючого прямокутника. Оскільки координати знаходяться в діапазоні від до , можна встановити початкові значення наступним чином:
minx = 10; maxx = 0; miny = 10; maxy = 0;Читаємо координати двох вихідних прямокутників. Для кожного прямокутника оновлюємо межі покриваючого прямокутника.
for (i = 0; i < 2; i++)
{
scanf("%d %d %d %d", &a1, &b1, &a2, &b2);
if (a1 < minx) minx = a1;
if (a2 > maxx) maxx = a2;
if (b1 < miny) miny = b1;
if (b2 > maxy) maxy = b2;
}Обчислюємо довжину і ширину покриваючого прямокутника.
l = maxx - minx;
w = maxy - miny;Щоб покрити цей прямокутник квадратом, сторона квадрата повинна бути не меншою як його довжини, так і ширини. Тому вибираємо більшу з двох величин.
len = (l > w) ? l : w;Обчислюємо площу квадрата і виводимо відповідь.
area = len * len;
printf("%d\n", area);