반응형
시뮬레이션 문제인가?
딱히 어려운 알고리즘이 필요한 문제는 아니다.
현재 바라보는 방향(동,서,남,북)에 따라 이동하거나 회전하여 확인하는 방향이 달라지는 것만 고려해서 구현하면 된다.
구현 코드
#include < iostream > using namespace std; int map[51][51] = { 0, }; int n, m; // map의 세로 N, 가로 크기 M int r, c, d; // 현재 위치 (r,c) 방향 d int cnt = 0; void func() { // 1. 현재 위치 청소, 방문 표시 if (map[r][c] == 0) { cnt++; map[r][c] = -1; } // 2. 현재 방향 기준으로 왼쪽으로 회전하며 // 이동(청소) 가능한지 확인 bool moveFlag = false; for (int i = 0; i < 4; i++) { switch (d) // 방향 { case 0: // 북 // boundary check && 청소 가능 if ( c-1 >= 0 && map[r][c-1]==0) { c = c - 1; moveFlag = true; } break; case 1: // 서 // boundary check && 청소 가능 if (r + 1 < n && map[r + 1][c] == 0) { r = r + 1; moveFlag = true; } break; case 2: // 남 // boundary check && 청소 가능 if ( c+1 < m && map[r][c+1] == 0) { c = c + 1; moveFlag = true; } break; case 3: // 동 // boundary check && 청소 가능 if (r - 1 >= 0 && map[r - 1][c] == 0) { r = r - 1; moveFlag = true; } break; } d = (d + 1) % 4; if (moveFlag==true) { // 4방향 중 이동할 수 있는 곳이 있음. // for문 빠져나오기 break; } } // 3-1. 이동할 수 있다면 (청소할 곳이 있다면) if (moveFlag == true) { // 이미 r,c위치와 d를 변경했으므로 // 그대로 방문 func(); } else { // 3-2. 네 방향 모두 청소되어있음. // 후진 가능한지 확인 switch (d) // 방향 { case 0: // 북 // boundary, 벽아닌지 체크 if ( r+1 < n && map[r+1][c] != 1) { r = r+1; func(); } break; case 1: // 서 // boundary, 벽아닌지 체크 if ( c+1 < m && map[r][c+1] != 1) { c = c + 1; func(); } break; case 2: // 남 // boundary, 벽아닌지 체크 if ( r-1 >= 0 && map[r-1][c] != 1) { r = r - 1; func(); } break; case 3: // 동 // boundary, 벽아닌지 체크 if ( c-1 >= 0 && map[r][c-1] != 1) { c = c - 1; func(); } break; } // 후진도 불가능함 return; } } int main(void) { // 입력 cin >> n >> m; cin >> r >> c >> d; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> map[i][j]; } } // 문제에서 주어진 방향 : 북 동 남 서 0 1 2 3 // 내가 가정 ( 반시계방향으로 확인 필요하기 때문) : 북 서 남 동 0 1 2 3 if (d==1) { d = 3; } else if (d == 3) { d = 1; } // 현재 위치 청소 가능한지 func(); cout << cnt << endl; return 0; }
반응형