카테고리 없음

[Baekjoon][14503] 로봇 청소기

어발 2022. 3. 10. 16:27

출처 - 백준사이트

14503. 로봇 청소기

나의 풀이

#include <iostream>
#include <queue>

#define MAX_SIZE    50

using namespace std;

int N, M, cnt;
int map[MAX_SIZE][MAX_SIZE] = {0, };

typedef struct {
    int x;
    int y;
    int dir;
} ROBOT;

// 각 index는 북 동 남 서일때 다음이동.
int dy[] = {0, -1, 0, 1 };
int dx[] = {-1, 0, 1, 0 };

int main () {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    ROBOT robot;

    cin >> N >> M;
    cin >> robot.y >> robot.x >> robot.dir;

    for (int y=0; y<N ; y++) {
        for (int x=0 ; x<M ; x++)
            cin >> map[y][x];
    }

    queue<ROBOT> q;
    q.push(robot);

    while (!q.empty()) {
        ROBOT temp = q.front(); q.pop();
        map[temp.y][temp.x] = 2;
        cnt++;

        int i = 0;
        for (i=0 ; i<4 ; i++) {
            int ny = temp.y + dy[temp.dir];
            int nx = temp.x + dx[temp.dir];

            temp.dir = (temp.dir + 3) % 4;

            if (map[ny][nx] == 0) { // 청소도안했고 벽도 아님.
                temp.y = ny;
                temp.x = nx;
                q.push(temp);
                break;
            }
            else  // 벽이거나 청소 했음.
                continue;
        }

        if (i==4) { // 후진할 조건
            int dir = (temp.dir + 3) % 4;

            int ny = temp.y + dy[dir];
            int nx = temp.x + dx[dir];

            if (map[ny][nx] == 1) // 벽이라면
                break;
            else {
                cnt--;
                temp.y = ny;
                temp.x = nx;
                q.push(temp);
            }
        }
    }

    cout << cnt;

    return 0;
}
728x90