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;