https://www.acmicpc.net/problem/14503

Baekjoon Online JudgeBaekjoon Online Judgewww.acmicpc.net


#include <stdio.h>
const int x[] = {0, -1, 0, 1};
const int y[] = {-1, 0, 1, 0};
int main() {
int N, M, r, c, d, room[52][52] = {0,}, ans = 0;
scanf("%d %d", &N, &M);
scanf("%d %d %d", &r, &c, &d);
for (int n=1; n<=N; n++) {
for (int m=1; m<=M; m++) {
scanf("%d", &room[n][m]);
room[n][m] ^= 1;
} // 0 : wall, 1 : empty, 2 : cleaned
}
r++;
c++;
while (1) {
if (room[r][c] == 1) {
room[r][c] = 2;
ans++;
} // condition 1
if (room[r+x[0]][c+y[0]]-1 && room[r+x[1]][c+y[1]]-1 && room[r+x[2]][c+y[2]]-1 && room[r+x[3]][c+y[3]]-1) {
if (room[r+x[(d+3)%4]][c+y[(d+3)%4]]==0) break;
r+=x[(d+3)%4];
c+=y[(d+3)%4];
} // condition 2-3 & 2-4
else if (room[r+x[d]][c+y[d]]%2 == 0) {
d=(d+3)%4;
} // condition 2-2
else {
r+=x[d];
c+=y[d];
d=(d+3)%4;
} // condition 2-1
}
printf("%d", ans);
}

구현 문제라서 그냥 시키는대로 구현을 하면 된다.

실수만 안 하면 되는데 실수가 나오기 좋은 문제인거 같아.


visit 배열을 굳이 만들 필요가 없어서 청소한 곳은 2로 바꿔줬어.

r+=x[d]; c+=y[d]; 하면 왼쪽 이동이고

r+=x[(d+3)%4]; c+=y[(d+3)%4]; 하면 뒤로 이동

d=(d+3)%4; 가 좌회전


0, 1 반전한 이유 :

1. 전부 0으로 초기화한 room 배열의 범위 밖의 0들을 벽으로 쓰고 싶음

2. %2 취하면 0되는 0, 2는 방문불가, 1은 방문가능으로 쓰고 싶음