문제 링크
https://www.acmicpc.net/problem/14503
아이디어
* 아래와 같이 문제에 주어진대로 시뮬레이션한다.
1. 현재 위치가 청소되지 않았다면 청소한다.
2.
for (4번) {
2-1. 왼쪽으로 90도 회전한다.
2-2. 바라보는 방향의 앞 칸이 청소되지 않았다면 전진하여 1로 돌아간다.
2-3. 바라보는 방향의 앞 칸이 청소되어 있다면 2-1로 돌아간다.
}
3. 모든 방향의 청소가 되어 있을 때(2-2를 한 번도 실행하지 않았다면)
3-1. 후진할 수 있다면 후진하여 1로 돌아간다.
3-2. 후진할 수 없다면 종료한다.
* 방향에 따른 이동량인 dy, dx의 배열을 index가 증가함에 따라 왼쪽으로 회전하도록 설정하면,
구현을 보다 쉽게 할 수 있다.
주의할 점
- 구현의 편의를 위해 dy, dx를 index가 증가함에 따라 왼쪽으로 회전하도록 설정했는데
문제에서 입력으로 주어지는 초기 방향 d의값과 일치하지 않기 때문에 동, 서에 대해서 처리해준다.
ex) d=1 일 때, 동쪽을 바라보는데 설정한 dy, dx에서는 index가 3일 때 동쪽을 바라본다.
따라서 if (d==1) dir = 3; 를 통해 값을 재조정 한다.
소스코드
#include <cstdio> #include <algorithm> using namespace std; const int dy[] = { -1, 0, 1 , 0 }; const int dx[] = { 0, -1, 0, 1 }; int main() { int n, m, r, c, d, map[55][55]; int dir, ans = 0; bool visit[55][55] = {0}; scanf("%d %d %d %d %d", &n, &m, &r, &c, &d); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) scanf("%d", &map[i][j]); dir = d; if (d == 1) dir = 3; else if (d == 3) dir = 1; while (1) { if (visit[r][c] == 0) { visit[r][c] = 1; ++ans; } int nr = 0, nc = 0; bool f = false; for (int i = 0; i < 4; ++i) { dir = (dir+1)%4; int nr = r + dy[dir]; int nc = c + dx[dir]; if (map[nr][nc] == 0 && visit[nr][nc] == 0) { r = nr; c = nc; f = true; break; } } if (f) continue; int back_r = r + dy[(dir + 2) % 4]; int back_c = c + dx[(dir + 2) % 4]; if (map[back_r][back_c] == 0) { r = back_r; c = back_c; } else { break; } } printf("%d\n", ans); }
공부한 것을 정리하기 위한 기록입니다.
틀린 부분이 있다면 언제나 부드럽게 알려주세요.
'PS > BOJ' 카테고리의 다른 글
[BOJ] 어른 상어 (0) | 2020.06.09 |
---|---|
[BOJ 19236] 청소년 상어 (0) | 2020.06.09 |
[BOJ 14499] 주사위 굴리기 (0) | 2020.05.14 |
[BOJ 1421] 나무꾼 이다솜 (0) | 2020.05.08 |
[BOJ 1411] 비슷한 단어 (0) | 2020.05.07 |
댓글