DFS
를 이용하는 문제
answer1
과 answer2
에 갱신해준다.flag
처리를 해줘서 v[y][x]
와 v[ny][nx]
가 R
이거나 G
인 경우 2번과 같이 처리한다.DFS
함수 호출이 끝나면 해당 구역의 방문처리는 끝난 것이므로 answer
갱신을 해주고, 다음 구역(방문하지 않은)부터 DFS
함수를 호출해준다.#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n;
vector<vector<char>> v;
int dy[4] = { -1,0,1,0 };
int dx[4] = { 0,1,0,-1 };
vector<vector<int>> visit;
void DFS(bool flag, int y, int x)
{
for (int i = 0; i < 4; i++)
{
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || ny >= n || nx < 0 || nx >= n) continue;
if (visit[ny][nx] == 1) continue;
if (v[y][x] == v[ny][nx])
{
visit[ny][nx] = 1;
DFS(flag, ny, nx);
}
else if (flag == true)
{
if ((v[y][x] == 'R' && v[ny][nx] == 'G') ||
(v[y][x] == 'G' && v[ny][nx] == 'R'))
{
visit[ny][nx] = 1;
DFS(flag, ny, nx);
}
}
}
}
int main(void)
{
cin >> n;
v.resize(n, vector<char>(n));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> v[i][j];
}
}
visit.resize(n, vector<int>(n));
int answer1 = 0;
int answer2 = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (visit[i][j] == 0)
{
answer1++;
DFS(false, i, j);
}
}
}
visit.clear();
visit.resize(n, vector<int>(n));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (visit[i][j] == 0)
{
answer2++;
DFS(true, i, j);
}
}
}
cout << answer1 << " " << answer2 << endl;
return 0;
}