Квадратне пасовище#10556

Квадратне пасовище (Розбір)

Нехай координати прямокутників задані наступним чином:

Розглянемо мінімальний за розмірами прямокутник, який повністю покриває обидва вихідні прямокутники. Позначимо його протилежні кути як (minx, miny) і (maxx, maxy). Тоді:

Розміри покриваючого прямокутника рівні:

Щоб обидва прямокутники можна було повністю покрити квадратом, сторона квадрата повинна бути не меншою як length, так і . Тому довжина сторони мінімального квадратного пасовища рівна максимуму з цих двох величин:

side = max(length, width)

Приклад

Розглянемо два вихідні прямокутники:

Обчислимо межі результуючого прямокутника:

Розміри покриваючого прямокутника рівні:

Довжина сторони покриваючого квадрата становитиме:

side = max(7, 3) = 7

Отже, площа мінімального покриваючого квадрата рівна 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);