간단한 문제입니다. 조건을 정리해봅시다.
위에 파란색으로 표시한 조건을 꼭 반영하셔야 합니다.
이 문제에서 가장 까다로운 점은 로봇의 방향과 진행 방향 사이의 관계를 찾는 것입니다.
로봇의 방향 | 진행 방향 (왼쪽, 오른쪽, 오른쪽, 아래쪽 순) |
---|---|
위쪽 (↑) | 왼쪽 (←), 위쪽 (↑), 오른쪽 (→), 아래쪽 (↓) |
왼쪽 (←) | 위쪽 (↑), 오른쪽 (→), 아래쪽 (↓), 왼쪽 (←) |
아래쪽 (↓) | 오른쪽 (→), 아래쪽 (↓), 왼쪽 (←), 위쪽 (↑) |
오른쪽 (→) | 아래쪽 (↓), 왼쪽 (←), 위쪽 (↑), 오른쪽 (→) |
#include <cstdio>
int N, M, r, c, d, ans = 1, map[50][50]; // 0: empty, 1: wall, 2: cleaned
int moving[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};
int main() {
scanf("%d %d", &N, &M);
scanf("%d %d %d", &r, &c, &d);
for (int y = 0; y < N; ++y)
for (int x = 0; x < M; ++x)
scanf("%d", &map[y][x]);
map[r][c] = 2;
int cnt = 0; // 4방향 진행 불가 카운트합니다.
while (true) {
int y = r + moving[d][0], x = c + moving[d][1];
// 진행 가능 여부 상관 없이 로봇 방향을 왼쪽으로 바꿔줍니다!
d = (d + 3) % 4;
cnt++;
// 만일 청소 가능한 구역이라면 청소합니다.
if (!map[y][x]) {
ans++;
map[y][x] = 2;
cnt = 0, r = y, c = x;
}
// 4방향 모두 갈 수 없으므로 후진합니다.
if (cnt == 4) {
int reverse = (d + 3) % 4;
int y = r + moving[reverse][0], x = c + moving[reverse][1];
// 후진조차 불가능하면 동작 정지합니다.
if (map[y][x] == 1) break;
cnt = 0, r = y, c = x;
}
}
printf("%d", ans);
}