#include <bits/stdc++.h>
using namespace std;
vector <int> adiacenta[1000001];
int inlocuitor[3000][3000];
char matrice[3000][3001];
bool vizitat[3000001];
int main ()
{
ios :: sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int linii , coloane;
cin >> linii >> coloane;
for (int linie = 0 ; linie < linii ; linie++)
{ cin >> matrice[linie]; }
int numar_noduri_1 = 0;
for (int linie = 0 ; linie < linii ; linie++) {
for (int coloana = 0 ; coloana < coloane ; coloana++) {
if (matrice[linie][coloana] == 'R' && ((coloana + 2 < coloane && matrice[linie][coloana + 1] == 'G' && matrice[linie][coloana + 2] == 'W') || (linie + 2 < linii && matrice[linie + 1][coloana] == 'G' && matrice[linie + 2][coloana] == 'W')))
{ inlocuitor[linie][coloana] = ++numar_noduri_1; }
}
}
int numar_noduri_2 = 0;
for (int linie = 0 ; linie < linii ; linie++) {
for (int coloana = 0 ; coloana < coloane ; coloana++) {
if (matrice[linie][coloana] == 'W' && ((coloana - 2 >= 0 && matrice[linie][coloana - 1] == 'G' && matrice[linie][coloana - 2] == 'R') || (linie - 2 >= 0 && matrice[linie - 1][coloana] == 'G' && matrice[linie - 2][coloana] == 'R')))
{ inlocuitor[linie][coloana] = ++numar_noduri_2 + numar_noduri_1; }
}
}
for (int linie = 0 ; linie < linii ; linie++) {
for (int coloana = 0 ; coloana < coloane ; coloana++) {
if (matrice[linie][coloana] == 'R' && inlocuitor[linie][coloana])
{
if (coloana + 2 < coloane && matrice[linie][coloana + 1] == 'G' && matrice[linie][coloana + 2] == 'W')
{ adiacenta[inlocuitor[linie][coloana]].push_back(inlocuitor[linie][coloana + 2]); }
if (linie + 2 < linii && matrice[linie + 1][coloana] == 'G' && matrice[linie + 2][coloana] == 'W')
{ adiacenta[inlocuitor[linie][coloana]].push_back(inlocuitor[linie + 2][coloana]); }
}
}
}
int cuplaj = 0;
for (int inceput = 1 ; inceput <= numar_noduri_1 ; inceput++) {
if (!vizitat[inceput])
{
int aparitii[2] = { };
queue <int> ramas; ramas.push(inceput);
while (!ramas.empty())
{
const int nod = ramas.front();
ramas.pop();
for (auto& vecin : adiacenta[nod]) {
if (!vizitat[vecin])
{ vizitat[vecin] = true; ramas.push(vecin); }
}
aparitii[nod <= numar_noduri_1 ? 0 : 1]++;
}
cuplaj += min(aparitii[0] , aparitii[1]);
}
}
cout << cuplaj;
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |