오랜만에 풀어본 DFS문제이다.
재귀함수로 풀어봤으니 다음에는 stack을 사용해 보겠다.
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector <vector <char>> board;
vector <vector <bool>> visited;
void input_floor()
{
int i, j;
cin >> N >> M;
board.resize(N, vector<char>(M));
visited.resize(N, vector<bool>(M, false));
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
cin >> board[i][j];
}
}
/*for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
cout << board[i][j] << " ";
}
cout << "\n";
}*/
return;
}
void DFS(char wood, int i, int j)
{
visited[i][j] = true;
if (wood == '-')
{
if (j == M - 1 || board[i][j+1] != wood)
{
return;
}
if (wood == board[i][j + 1] && j + 1 < M)
{
DFS(wood, i, j + 1);
}
}
else// wood == '|'
{
if (i == N - 1 || board[i + 1][j] != wood)
{
return;
}
if (wood == board[i + 1][j] && i + 1 < N)
{
DFS(wood, i + 1, j);
}
}
}
void find_answer()
{
int i, j;
int answer = 0;
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
if (visited[i][j] == false)
{
answer++;
DFS(board[i][j], i, j);
}
}
}
cout << answer << "\n";
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
input_floor();
find_answer();
return 0;
}