Vezirin hərəkəti#1417

Vezir — bu, üfüqi, şaquli və diaqonal istiqamətdə hərəkət edən (və vuran) bir şahmat fiqurudur.

Vezirin dayandığı sıra hüceyrədən ibarətdir. Buna görə üfüqi hərəkət üçün mövcud olan hüceyrələrin sayı n - 1 olur. Eyni qaydada, vezirin dayandığı sütun hüceyrədən ibarətdir, deməli, şaquli hərəkət üçün mövcud olan hüceyrələrin sayı m - 1 olur.

Beləliklə, vezirin üfüqi və şaquli istiqamətdə hərəkət etdiyi hüceyrələrin sayı n - 1 + m - 1-ə bərabərdir.

Şahmat taxtasını vezirin dayandığı hüceyrədən üfüqi və şaquli xətlər çəkərək dörd bölgəyə ayıraq. Hər bir bu bölgələrdə vezirin təsir etdiyi hüceyrələrin sayını hesablayacağıq.

Məsələn, sol yuxarı dörddəlik bölgəni nəzərdən keçirək. Onun uzunluğu n - y hüceyrədir və eni x - 1 hüceyrədir. Beləliklə, bu bölgədə vezirin təsiri altında olan hüceyrələrin sayı min(x - 1, n - y)-ə bərabərdir.

Eyni qaydada:

Nümunə

Şahmat taxtasının ölçüsünün 8 \times 8 olduğu və vezirin mövqeyində olduğu bir nümunəni nəzərdən keçirək.

Vezirin təsiri altında olan üfüqi və şaquli hüceyrələrin sayı n - 1 + m - 1 = 7 + 7 = 14-ə bərabərdir. İndi isə dörd dörddəlik üzrə hər birində vezirin təsiri altında olan hüceyrələrin sayı hesablanır:

Ümumilikdə vezirin təsiri altında olan hüceyrələrin sayı 14 + 3 + 4 + 3 + 3 = 27 olur.

Alqoritmin tətbiqi

Giriş verilənləri oxuyuruq.

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

Horizonsal və vertikal hərəkətlərdə vezirin təsiri altında olan hüceyrələrin sayını dəyişənində saxlayırıq.

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

Sonra vezirin diaqonal istiqamətdə təsiri altında olan hüceyrələri əlavə edirik.

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)

Cavabı çap edirik.

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