큐를 이용하여 청소가 끝나는 시점까지 반복문을 돌도록 해주었다.
입력 조건을 보면 지도의 첫 행, 마지막 행, 첫 열, 마지막 열에 있는 모든 칸은 벽이다. 라는 설명이 있다.
그래서 따로 맵의 끝 부분을 예외 처리 해주지 않았다.
이미 청소가 완료된 곳은 0에서 2로 바꿔주었다.
문제에서 설명하는 로봇 청소기의 동작 방식을 그대로 따라 조건문을 만들어주면 된다.
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int N, M;
int r, c, d, res = 0;
int A[51][51];
int dy[4] = { -1,0,1,0 };
int dx[4] = { 0,1,0,-1 };
void moveCleaner() {
queue<pair<int, int>> q;
q.push({ r,c });
while (!q.empty()) {
int y = q.front().first;
int x = q.front().second;
q.pop();
if (A[y][x] == 0) {
res++;
A[y][x] = 2;
}
int i;
for (i = 0; i < 4; i++) {
d--;
if (d < 0) d = 3;
int ry = y + dy[d];
int rx = x + dx[d];
if (A[ry][rx] != 0) continue;
q.push({ ry,rx });
break;
}
if (i == 4) {
int tmpd = d - 2;
if (tmpd < 0) tmpd += 4;
int by = y + dy[tmpd];
int bx = x + dx[tmpd];
if (A[by][bx] == 1) break;
q.push({ by,bx });
}
}
}
void solution() {
moveCleaner();
cout << res;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
cin >> r >> c >> d;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> A[i][j];
}
}
solution();
return 0;
}