Koordinat sistemi quraq. Məsələn, sol yuxarı küncün koordinatları olsun. Tövlənin (b_x, b_y), gölün (l_x, l_y) və daşın (r_x, r_y) koordinatlarını tapaq.
Sonra Manhettən məsafələrini tapaq:
d_{BL} = BarnLake — tövlə ilə göl arasında;
d_{BR} = BarnRock — tövlə ilə daş arasında;
d_{LR} = LakeRock — göl ilə daş arasında;
A(x_1, y_1) və B(x_2, y_2) obyektləri arasındakı Manhettən məsafəsi aşağıdakı düsturla hesablanır:
Daşı nəzərə almasaq, briqadadakı inəklərin sayı tövlə ilə göl arasındakı Manhettən məsafəsindən bir vahid az olmalıdır.
Tələb olunan inək sayı yalnız o halda vahid artır ki, tövlə və göl eyni üfüqi və ya şaquli düz xəttdə yerləşsin, daş isə onların arasındakı yolda olsun. Sonuncu şərt aşağıdakı halda ödənilir:
Tövlə və göl eyni üfüqi xəttdədir, əgər b_y = l_y.
Tövlə və göl eyni şaquli xəttdədir, əgər b_x = l_x.
Nümunə
Verilmiş nümunə üçün obyektlərin koordinatları aşağıdakı kimidir:
tövlə ,
göl ,
daş
Tövlə ilə göl arasındakı Manhettən məsafəsi | 8 - 3 | + | 5 - 2 | = 8-ə bərabərdir. Tələb olunan inək sayı 8 - 1 = 7-dir.
İndi isə daşın tövlə ilə göl arasında yerləşdiyi növbəti nümunəyə baxaq. Tövlə ilə göl arasındakı məsafə -dir. Daşı nəzərə almasaq, inək tələb olunacaq. Lakin daş düz yolu bağladığından, onun ətrafından keçmək üçün əlavə olaraq inək tələb olunacaq. Beləliklə, ümumi inək sayı 4 + 2 = 6 olacaq.
Alqoritmin realizasiyası
Giriş məlumatlarını oxuyuruq. Giriş sahəsinin ölçüsü 10 \times 10-dır.
for (i = 0; i < 10; i++)
cin >> s[i];Tövlənin (b_x, b_y), gölün (l_x, l_y) və daşın (r_x, r_y) koordinatlarını tapırıq.
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; }
}Aşağıdakı Manhettən məsafələrini hesablayırıq:
BarnLake — tövlə ilə göl arasında;
BarnRock — tövlə ilə daş arasında;
LakeRock — göl ilə daş arasında;
BarnLake = abs(bx - lx) + abs(by - ly);
BarnRock = abs(bx - rx) + abs(by - ry);
LakeRock = abs(lx - rx) + abs(ly - ry);Tövlə ilə göl arasında briqada formalaşdırmaq üçün lazım olan inək sayını tapırıq. Bu, (b_x, b_y) və (l_x, l_y) nöqtələri arasındakı Manhettən məsafəsindən bir vahid azdır.
res = BarnLake - 1;Əgər tövlə və göl eyni üfüqi və ya şaquli xəttdə yerləşirsə, daş isə onların arasındakı yolda yerləşirsə, onda zəncir qurmaq üçün lazım olan inək sayı vahid artırılmalıdır.
if ((BarnLake == BarnRock + LakeRock) && (bx == lx || by == ly))
res += 2;Cavabı çıxarırıq.
cout << res << endl;