Введемо систему координат. Наприклад, нехай верхній лівий кут має координати . Знайдемо координати сараю (b_x, b_y), озера (l_x, l_y) та каменя (r_x, r_y).
Далі знайдемо манхеттенські відстані:
d_{BL} = BarnLake — між сараєм та озером;
d_{BR} = BarnRock — між сараєм та каменем;
d_{LR} = LakeRock — між озером та каменем;
Манхеттенська відстань між об'єктами A(x_1, y_1) та B(x_2, y_2) обчислюється за формулою:
Якщо не враховувати камінь, то кількість корів у бригаді повинна дорівнювати манхеттенській відстані між сараєм та озером мінус один.
Необхідна кількість корів збільшується на лише в тому випадку, якщо сарай та озеро знаходяться на одній горизонтальній або вертикальній прямій, а камінь розташований на шляху між ними. Остання умова виконується, якщо:
Сарай та озеро знаходяться на одній горизонтальній прямій, якщо 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 — між сараєм та озером;
BarnRock — між сараєм та каменем;
LakeRock — між озером та каменем;
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;