https://www.acmicpc.net/problem/16724
이 문제는 dfs를 통한 사이클을 검사한다 즉 dfs로 진행하면서 마무리전에는 진행 중으로 체크하다가 탐색하다가 진행중을 만나면 해당 영역은 사이클을 형성 한다 우리는 사이클의 갯수를 구해주면 된다
#include <iostream>
using namespace std;
const int MAX = 1000;
char arr[MAX][MAX];
int n, m;
int isVisited[MAX][MAX] = { 0, };
int dX[128]; int dY[128];
int cnt=0;
void dfs(int x, int y) {
isVisited[x][y] = 1;
int nx, ny;
nx = x + dX[arr[x][y]];
ny = y + dY[arr[x][y]];
if (isVisited[nx][ny] == 0) {
dfs(nx, ny);
}
else if (isVisited[nx][ny] == 1){
cnt++;
}
isVisited[x][y] = 2;
}
int main() {
cin >> n >> m;
dX['U'] = -1; dY['U'] = 0;
dX['D'] = 1; dY['D'] = 0;
dX['R'] = 0; dY['R'] = 1;
dX['L'] = 0; dY['L'] = -1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (isVisited[i][j] == 0) {
dfs(i, j);
}
}
}
cout << cnt;
}