Analysis: Cow Art by Brian Dean

This problem involves running a "flood fill" algorithm to visit each region, marking it as visited, until all regions are visited and counted. In my code below, I use a recursive "depth-first" search to fill in each successive region. The visit() function marks a cell as being visited and then recursively visits all neighboring cells that are part of the same region.

```#include <iostream>
#include <fstream>
#include <string>
#define MAX_N 100
using namespace std;

string A[MAX_N];
int N;
bool valid[256][256];
bool visited[MAX_N][MAX_N];

void visit(int i, int j)
{
if (visited[i][j]) return;
visited[i][j] = true;
if (i > 0   && valid[A[i-1][j]][A[i][j]]) visit(i-1, j);
if (j > 0   && valid[A[i][j-1]][A[i][j]]) visit(i, j-1);
if (i < N-1 && valid[A[i+1][j]][A[i][j]]) visit(i+1, j);
if (j < N-1 && valid[A[i][j+1]][A[i][j]]) visit(i, j+1);
}

int solve(void)
{
int count = 0;
for (int i=0; i<N; i++)
for (int j=0; j<N; j++)
visited[i][j] = false;
for (int i=0; i<N; i++)
for (int j=0; j<N; j++)
if (!visited[i][j]) {
count++;
visit(i,j);
}
return count;
}

int main(void)
{
ifstream fin("cowart.in");
fin >> N;
for (int i=0; i<N; i++) fin >> A[i];
fin.close();

valid['R']['R'] = valid['G']['G'] = valid['B']['B'] = true;
int regions_human = solve();
valid['R']['G'] = valid['G']['R'] = true;
int regions_cow = solve();

ofstream fout("cowart.out");
fout << regions_human << " " << regions_cow << "\n";
fout.close();

return 0;
}
```