Catena di secchi#10316

Catena di secchi (Editoriale)

Introduciamo un sistema di coordinate. Ad esempio, supponiamo che l'angolo superiore sinistro abbia coordinate . Troviamo le coordinate del fienile (b_x, b_y), del lago (l_x, l_y) e della roccia (r_x, r_y).

Di seguito troviamo le distanze di Manhattan:

La distanza di Manhattan tra gli oggetti A(x_1, y_1) e B(x_2, y_2) si calcola con la formula:

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

Se non si tiene conto della roccia, il numero di mucche nella squadra deve essere pari alla distanza di Manhattan tra il fienile e il lago meno uno.

Il numero richiesto di mucche aumenta di solo nel caso in cui il fienile e il lago si trovino sulla stessa retta orizzontale o verticale, e la roccia sia posizionata sul percorso tra di essi. Quest'ultima condizione è soddisfatta se:

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

Il fienile e il lago si trovano sulla stessa retta orizzontale se b_y = l_y.

Il fienile e il lago si trovano sulla stessa retta verticale se b_x = l_x.

Esempio

Per l'esempio dato, gli oggetti hanno le seguenti coordinate:

La distanza di Manhattan tra il fienile e il lago è pari a | 8 - 3 | + | 5 - 2 | = 8. Il numero richiesto di mucche è pari a 8 - 1 = 7.

Consideriamo il seguente esempio, in cui la roccia si trova tra il fienile e il lago. La distanza tra il fienile e il lago è pari a . Senza tenere conto della roccia sarebbero necessarie mucche. Tuttavia, poiché la roccia blocca il percorso diretto, per superarla saranno necessarie mucche aggiuntive. Pertanto, il numero totale di mucche sarà 4 + 2 = 6.

Implementazione dell'algoritmo

Leggiamo i dati di input. La dimensione del campo di input è 10 \times 10.

for (i = 0; i < 10; i++)
  cin >> s[i];

Troviamo le coordinate del fienile (b_x, b_y), del lago (l_x, l_y) e della roccia (r_x, r_y).

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; }
}

Calcoliamo le seguenti distanze di Manhattan:

BarnLake = abs(bx - lx) + abs(by - ly);
BarnRock = abs(bx - rx) + abs(by - ry);
LakeRock = abs(lx - rx) + abs(ly - ry);

Troviamo il numero di mucche necessario per formare la squadra tra il fienile e il lago. Esso è inferiore di uno rispetto alla distanza di Manhattan tra i punti (b_x, b_y) e (l_x, l_y).

res = BarnLake - 1;

Se il fienile e il lago si trovano sulla stessa orizzontale o verticale, e la roccia è posizionata sul percorso tra di essi, allora il numero di mucche necessario per costruire la catena deve essere aumentato di .

if ((BarnLake == BarnRock + LakeRock) && (bx == lx || by == ly)) 
  res += 2;

Stampiamo la risposta.

cout << res << endl;