Хід ферзя#1417

Хід ферзя (Розбір)

Ферзь — це шахматна фігура, яка ходить (і б'є) по горизонталі, вертикалі та діагоналі.

Рядок, у якому стоїть ферзь, містить клітинок. Тому кількість клітинок, доступних для горизонтального ходу, дорівнює n - 1. Аналогічно, стовпчик, у якому знаходиться ферзь, містить клітинок, отже, кількість клітинок, доступних для вертикального ходу, дорівнює m - 1.

Таким чином, під ударом ферзя по горизонталі та вертикалі знаходяться n - 1 + m - 1 клітинок.

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

Розглянемо, наприклад, праву верхню чверть. Її довжина становить n - y клітинок, а ширина x - 1 клітинок. Отже, кількість клітинок під ударом ферзя в цій області дорівнює min(x - 1, n - y).

Аналогічно:

Приклад

Розглянемо приклад, у якому розмір дошки дорівнює 8 \times 8, а ферзь знаходиться в позиції .

Під горизонтальним та вертикальним ударом ферзя знаходиться n - 1 + m - 1 = 7 + 7 = 14 клітинок. Тепер розглянемо чотири чверті, у кожній з яких підрахуємо кількість клітинок під його ударом:

Загалом під ударом ферзя знаходиться 14 + 3 + 4 + 3 + 3 = 27 клітинок.

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

Читаємо вхідні дані.

scanf("%d %d %d %d", &m, &n, &x, &y);

Зберігаємо в змінну кількість клітинок, які знаходяться під ударом ферзя при горизонтальних та вертикальних ходах.

s = m - 1 + n - 1; // horiz & vertical

Потім додаємо клітинки, які ферзь б'є по діагоналях.

s += min(m - x, n - y); // (x,y) = (m, n)
s += min(m - x, y - 1); // (x,y) = (m, 1)
s += min(x - 1, n - y); // (x,y) = (1, n)
s += min(x - 1, y - 1); // (x,y) = (1, 1)

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

printf("%lld\n",s);