백준 14503 로봇 청소기 (C++)

안유태·2022년 7월 4일
0

알고리즘

목록 보기
1/239

14503번: 로봇청소기

큐를 이용하여 청소가 끝나는 시점까지 반복문을 돌도록 해주었다.
입력 조건을 보면 지도의 첫 행, 마지막 행, 첫 열, 마지막 열에 있는 모든 칸은 벽이다. 라는 설명이 있다.
그래서 따로 맵의 끝 부분을 예외 처리 해주지 않았다.
이미 청소가 완료된 곳은 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;
}
profile
공부하는 개발자

0개의 댓글