Ковшова бригада#10316

Ковшова бригада (Розбір)

Введемо систему координат. Наприклад, нехай верхній лівий кут має координати . Знайдемо координати сараю (b_x, b_y), озера (l_x, l_y) та каменя (r_x, r_y).

Далі знайдемо манхеттенські відстані:

Манхеттенська відстань між об'єктами A(x_1, y_1) та B(x_2, y_2) обчислюється за формулою:

d_{AB} = | x_2 - x_1 | + | y_2 - y_1 |

Якщо не враховувати камінь, то кількість корів у бригаді повинна дорівнювати манхеттенській відстані між сараєм та озером мінус один.

Необхідна кількість корів збільшується на лише в тому випадку, якщо сарай та озеро знаходяться на одній горизонтальній або вертикальній прямій, а камінь розташований на шляху між ними. Остання умова виконується, якщо:

d_{BL} = d_{BR} + d_{LR}

Сарай та озеро знаходяться на одній горизонтальній прямій, якщо b_y = l_y.

Сарай та озеро знаходяться на одній вертикальній прямій, якщо b_x = l_x.

Приклад

Для заданого прикладу об'єкти мають наступні координати:

Манхеттенська відстань між сараєм та озером дорівнює | 8 - 3 | + | 5 - 2 | = 8. Необхідна кількість корів дорівнює 8 - 1 = 7.

Розглянемо наступний приклад, у якому камінь знаходиться між сараєм та озером. Відстань між сараєм та озером дорівнює . Без урахування каменя знадобиться корови. Однак, оскільки камінь перегороджує прямий шлях, для його обходу знадобиться додатково корови. Таким чином, загальна кількість корів становитиме 4 + 2 = 6.

Реалізація алгоритму

Читаємо вхідні дані. Розмір вхідного поля 10 \times 10.

for (i = 0; i < 10; i++)
  cin >> s[i];

Знаходимо координати сараю (b_x, b_y), озера (l_x, l_y) та каменя (r_x, r_y).

for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
{
  if (s[i][j] == 'R') { rx = i; ry = j; }
  if (s[i][j] == 'B') { bx = i; by = j; }
  if (s[i][j] == 'L') { lx = i; ly = j; }
}

Обчислюємо наступні манхеттенські відстані:

BarnLake = abs(bx - lx) + abs(by - ly);
BarnRock = abs(bx - rx) + abs(by - ry);
LakeRock = abs(lx - rx) + abs(ly - ry);

Знаходимо кількість корів, необхідну для формування бригади між сараєм та озером. Вона на одиницю менша за манхеттенську відстань між точками (b_x, b_y) та (l_x, l_y).

res = BarnLake - 1;

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

if ((BarnLake == BarnRock + LakeRock) && (bx == lx || by == ly)) 
  res += 2;

Виводимо відповідь.

cout << res << endl;