Confine#2507

Confine (Editoriale)

Inseriamo l'area rettangolare in un array di caratteri. Consideriamo l'elemento . Se differisce da s[i + 1][j], significa che tra di essi passa un confine di lunghezza (cioè sotto c'è un confine).

Analogamente, se differisce da s[i][j + 1], tra di essi passa anch'esso un confine di lunghezza (a destra di c'è un confine).

Resta da esaminare tutte le posizioni e per ciascuna contare il numero di confini inferiori e destri.

Esempio

Il confine tra gli stati è mostrato in rosso. La sua lunghezza è pari a .

Implementazione dell'algoritmo

Memorizziamo i territori degli stati nell'array .

#define MAX 110
char s[MAX][MAX];

Leggiamo i dati di input.

scanf("%d %d\n", &w, &h);
for (i = 0; i < h; i++)
  gets(s[i]);

Calcoliamo la lunghezza dei confini verticali.

for (i = 0; i < h; i++)
for (j = 0; j < w - 1; j++)
  if (s[i][j] != s[i][j + 1]) res++;

Calcoliamo la lunghezza dei confini orizzontali.

for (i = 0; i < h - 1; i++)
for (j = 0; j < w; j++)
  if (s[i][j] != s[i + 1][j]) res++;

Stampiamo la risposta.

printf("%d\n", res);

Implementazione dell'algoritmo – string

Memorizziamo i territori degli stati nell'array .

vector<string> s;

Leggiamo i dati di input.

cin >> w >> h;
s.resize(h);
for (i = 0; i < h; i++)
  cin >> s[i];

Calcoliamo la lunghezza dei confini verticali.

for(i = 0; i < h; i++)
for(j = 0; j < w - 1; j++)
  if (s[i][j] != s[i][j+1]) res++;

Calcoliamo la lunghezza dei confini orizzontali.

for(i = 0; i < h - 1; i++)
for(j = 0; j < w; j++)
  if (s[i][j] != s[i+1][j]) res++;

Stampiamo la risposta.

cout << res << endl;