본문 바로가기
  • 개발을 사랑하는 실실쟌의 블로그입니다
PS문제들

[백준] 14503: 로봇 청소기

by 실실쟌 2022. 8. 25.

 

문제

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

구상

그냥 조건을 잘 읽고 조건에서 시키는 대로 구현하기만 하면 된다. 코드로 뭔가 보여드리겠습니다.

 

코드

굳이 핵심을 뽑자면, left를 저렇게 array로 처리해서 깔끔하게 한 것? 다 저번 포스팅에서 말한 dx, dy 잡는 법 덕분에... 인터넷 세상은 대단하다. 나도 인터넷 세상의 지식적 풍요에 일조하고 싶지만 참 마음처럼 쉽지 않다.

 

#include<iostream>

using namespace std;

int look_left[4] = {3,0,1,2}; // up right down left -> left up right down
int dx[4] = {-1, 0, 1, 0}; // up right down left
int dy[4] = {0, 1, 0, -1}; // up right down left

int main(int argc, char** argv)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N, M;
    int **board;
    bool **clear;
    int now_x, now_y, now_direction;
    cin >> N >> M;
    cin >> now_x >> now_y >> now_direction;

    board = new int*[N];
    clear = new bool*[N];
    for(int i=0; i<N; i++) {
        board[i] = new int[M];
        clear[i] = new bool[M];
        for(int j=0; j<M; j++) {
            cin >> board[i][j];
            clear[i][j] = false;
        }
    }

    bool done = false;
    bool from_one = true;
    int area = 0;

    while(!done) {
        if(from_one){
            //case 1
            clear[now_x][now_y] = true;
            area += 1;
            from_one = false;
        }
        int i=0;
        for(; i<4; i++) {
            now_direction = look_left[now_direction]; // case 2-1's first step & case 2-2 : rotate
            if (!clear[now_x + dx[now_direction]][now_y + dy[now_direction]] && board[now_x + dx[now_direction]][now_y + dy[now_direction]] != 1) {
                //case 2-1 : move
                now_x += dx[now_direction];
                now_y += dy[now_direction];
                from_one = true;
                break;
            }
        }
        if(i == 4) {
            // returned to the first direction
            int back = look_left[look_left[now_direction]];
            if(board[now_x + dx[back]][now_y + dy[back]] == 1) {
                // case 2-4
                done = true;
            }
            else {
                now_x += dx[back];
                now_y += dy[back];
            }
        }
    }

    cout << area << "\n";

	return 0;
}

 

 

 

 

 

 

댓글