Vedrə briqadası#10316

Vedrə briqadası (Həll təhlili)

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:

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:

d_{AB} = | x_2 - x_1 | + | y_2 - y_1 |

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:

d_{BL} = d_{BR} + d_{LR}

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ə 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 = 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;