백준[14503] - 로봇 청소기

문제

백준 14503 문제 보기

접근 방법

구현 문제인 것 같다. 현재 방향과 4방향의 방 검사 후 위치를 이동할 때 주의하여 풀면 문제를 풀수 있다.

  • 4방향을 검사하여 빈 방이 있는지 확인.
  • 빈 방이 존재한다면 방향을 바꾸고 방 청소.
  • 빈방이 없다면 후진 실행.

코드

#include <iostream>
#include <cstring>

using namespace std;

int dr[4] = { -1, 0, 1, 0 };
int dc[4] = { 0, 1, 0, -1 };
int map[51][51];
int r, c, dir, nextR, nextC;
int N, M;
int clean, cnt;

int change_dir(int now) {
    if (now == 0) {
        return 3;
    }
    else if (now == 1) {
        return 0;
    }
    else if (now == 2) {
        return 1;
    }
    else {
        return 2;
    }
}

int main() {
    cin >> N >> M;
    cin >> r >> c >> dir;
    memset(map, 0, sizeof(map));
    for (int i = 0; i < N; i++){
        for (int j = 0; j < M; j++) {
            cin >> map[i][j];
        }
    }
    cnt++;
    map[r][c] = 2;
    while (1) {
        int tdir = dir;
        for (int i = 0; i < 4; i++) {
            clean = 0;
            tdir = change_dir(tdir);
            nextR = r + dr[tdir];
            nextC = c + dc[tdir];

            if (nextC >= 0 && nextC < M && nextR >= 0 && nextR < N && map[nextR][nextC] == 0) {
                cnt += 1;
                dir = tdir;
                r = nextR;
                c = nextC;
                map[r][c] = 2;
                clean = 1;
                break;
            }
        }

        if (clean == 0) {
            if (dir == 0) {
                r++;
            }
            else if (dir == 1) {
                c--;
            }
            else if (dir == 2) {
                r--;
            }
            else if (dir == 3) {
                c++;
            }

            if (map[r][c] == 1) {
                break;
            }
        }
    }

    cout << cnt;
    return 0;
}
Share