formula
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
일때
반시계 90도(왼쪽 회전) = (d + 3) % 4
시계 90도(우측 회전) = (d + 1) % 4
뒤로 돌기(180도 회전) = (d + 2) % 4
Implementation
#include <iostream>
using namespace std;
int N, M;
int matrix[51][51];
int r, c, d; // x, y, dir
int cnt = 0; // result
// 북 동 남 서 = 위 오 아 왼
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
void solve() {
while (true) {
// case 1
if (matrix[r][c] == 0) {
matrix[r][c] = 2; // 2 : Cleaned
cnt++;
}
bool cleaned = false; // check flag
// case 3
for (int i = 0; i < 4; i++) {
// 반시계 방향 90도(왼쪽 회전)
d = (d + 3) % 4;
int nx = r + dx[d];
int ny = c + dy[d];
// check
if (nx >= 0 && nx < N && ny >= 0 && ny < M && matrix[nx][ny] == 0) {
r = nx;
c = ny;
cleaned = true;
break; // goto case 1
}
}
// Case 2
if (!cleaned) {
int back_r = r - dx[d];
int back_c = c - dy[d];
// 2-2
if (back_r >= 0 && back_r < N && back_c >= 0 && back_c < M && matrix[back_r][back_c] == 1) {
break; // 동작 끝
}
// 2-1 goto case 1
else {
r = back_r;
c = back_c;
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M;
cin >> r >> c >> d;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> matrix[i][j];
}
}
solve();
cout << cnt << endl;
return 0;
}
우선순위상 조건3을 먼저 구현하고 넘어가야 2번 진입해야됨