본문 바로가기
PS/BOJ

[BOJ 14503] 로봇청소기

by Saerong2 2020. 5. 15.

 

 

문제 링크

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

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

 


아이디어

 

* 아래와 같이 문제에 주어진대로 시뮬레이션한다.

 

1. 현재 위치가 청소되지 않았다면 청소한다.

2.

for (4번) {

    2-1. 왼쪽으로 90도 회전한다.

    2-2. 바라보는 방향의 앞 칸이 청소되지 않았다면 전진하여 1로 돌아간다.

    2-3. 바라보는 방향의 앞 칸이 청소되어 있다면 2-1로 돌아간다.

}

3. 모든 방향의 청소가 되어 있을 때(2-2를 한 번도 실행하지 않았다면)

   3-1. 후진할 수 있다면 후진하여 1로 돌아간다.

   3-2. 후진할 수 없다면 종료한다.

 

 

* 방향에 따른 이동량인 dy, dx의 배열을 index가 증가함에 따라 왼쪽으로 회전하도록 설정하면,

  구현을 보다 쉽게 할 수 있다.

 


주의할 점

 

  •  구현의 편의를 위해 dy, dx를 index가 증가함에 따라 왼쪽으로 회전하도록 설정했는데
     문제에서 입력으로 주어지는 초기 방향 d의값과 일치하지 않기 때문에 동, 서에 대해서 처리해준다.
     ex) d=1 일 때, 동쪽을 바라보는데 설정한 dy, dx에서는 index가 3일 때 동쪽을 바라본다.
          따라서 if (d==1) dir = 3; 를 통해 값을 재조정 한다.

소스코드

#include <cstdio>
#include <algorithm>

using namespace std;

const int dy[] = { -1, 0, 1 , 0 };
const int dx[] = { 0, -1, 0, 1 };

int main()
{
    int n, m, r, c, d, map[55][55];
    int dir, ans = 0;
    bool visit[55][55] = {0};

    scanf("%d %d %d %d %d", &n, &m, &r, &c, &d);
    
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            scanf("%d", &map[i][j]);

    dir = d;
    if (d == 1) dir = 3;
    else if (d == 3) dir = 1;

    while (1) {
        if (visit[r][c] == 0) {
            visit[r][c] = 1;
            ++ans;
        }

        int nr = 0, nc = 0;
        bool f = false;
        for (int i = 0; i < 4; ++i) {
            dir = (dir+1)%4;
            int nr = r + dy[dir];
            int nc = c + dx[dir];
            if (map[nr][nc] == 0 && visit[nr][nc] == 0) {
                r = nr;
                c = nc;
                f = true;
                break;
            }
        }

        if (f) continue;

        int back_r = r + dy[(dir + 2) % 4];
        int back_c = c + dx[(dir + 2) % 4];

        if (map[back_r][back_c] == 0) {
            r = back_r;
            c = back_c;
        }
        else {
            break;
        }
    }
    printf("%d\n", ans);
}

 

 

 

 

 

공부한 것을 정리하기 위한 기록입니다.

틀린 부분이 있다면 언제나 부드럽게 알려주세요.

'PS > BOJ' 카테고리의 다른 글

[BOJ] 어른 상어  (0) 2020.06.09
[BOJ 19236] 청소년 상어  (0) 2020.06.09
[BOJ 14499] 주사위 굴리기  (0) 2020.05.14
[BOJ 1421] 나무꾼 이다솜  (0) 2020.05.08
[BOJ 1411] 비슷한 단어  (0) 2020.05.07

댓글