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:
sol yuxarı dörddəlik bölgədə vezirin təsiri altında olan hüceyrələrin sayı min(x - 1, y - 1);
sol aşağı dörddəlik bölgədə vezirin təsiri altında olan hüceyrələrin sayı min(m - x, y - 1);
sağ aşağı dörddəlik bölgədə vezirin təsiri altında olan hüceyrələrin sayı min(m - x, n - y);
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:
sol yuxarı dörddəlik bölgədə min(4, 3) = 3 hüceyrə;
sol aşağı dörddəlik bölgədə min(4, 4) = 4 hüceyrə;
sağ aşağı dörddəlik bölgədə min(3, 4) = 3 hüceyrə;
sağ yuxarı dörddəlik bölgədə min(3, 3) = 3 hüceyrə;
Ü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 & verticalSonra 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);