[BOJ] 14503번 로봇 청소기

Apr 9, 2019


https://www.acmicpc.net/problem/14503

단순한 시뮬레이션 문제입니다. 저는 재귀를 사용했으며 청소한 곳은 2로 해줬고,

for문을 통해 4방향을 체크했으며, 체크도중에 청소할 곳이 생기면 그곳으로 가게했습니다.

그냥 주어진 문제대로 구성하면 되지만 그나마 주의할 점이라면

왼쪽을 보기때문에 정해진 방향에서 반시계 방향으로 돌기위해 -1씩 해줘야한다는 점입니다.

처음에 문제를 좀 이해하기 힘들 수 있는데(저 같은 경우 ^^;)

  1. 현재 위치를 청소한다.
  2. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
    2-1. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 왼쪽 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
    2-2. 왼쪽 방향에 청소할 공간이 없다면, 왼쪽으로 회전하고 2번으로 돌아간다.
    2-3. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
    2-4. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
#include <iostream>
using namespace std;
int n, m, map[51][51], result;
int dr[] = { -1,0,1,0 };
int dc[] = { 0,1,0,-1 };
void go(int r, int c, int dir, int cnt) {//0북,1동,2남,3서
    map[r][c] = 2;//청소
    for (int i = 1; i <= 4; i++) {
        int ndir = dir - i;//왼쪽이므로 -해줘야함
        if (ndir < 0) ndir += 4;//음수면 +4
        int nr = r + dr[ndir];
        int nc = c + dc[ndir];
        if (map[nr][nc] == 0) {//청소할곳있으면
            go(nr, nc, ndir, cnt + 1);
            return;
        }
        if (i == 4) {//청소할곳없으면
            int br = r - dr[dir];
            int bc = c - dc[dir];
            if (map[br][bc] == 2) {//후진
                go(br, bc, dir, cnt);
                return;
            }
            else {//끝
                cout << cnt;
                return;
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int r, c, d;
    cin >> n >> m >> r >> c >> d;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> map[i][j];
        }
    }
    go(r, c, d, 1);
}
  • 나 혼자 말하고 나 혼자 듣는 말

후.. 쉬우면 뭐하나 실수를 많이해서 결국 오래걸리는데…
나란 녀석…
반성하자!!!!!!