알고리즘/백준(BOJ)

백준 - 14503 로봇 청소기

시나모온 2020. 10. 16. 00:43

문제 링크입니다 : www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

 

구현문제

 

 

 

 

 

#include <iostream>
#include <vector>
#define CLEAN 2

using namespace std;

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

int N, M;

vector<vector<int>> board;

int main() {
    cin >> N >> M;

    board.assign(N, vector<int>(M));

    int y, x, dir;
    cin >> y >> x >> dir;


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

    int cleanCnt = 0;
    int leftCnt = 0;
    bool one_flag = true;

    while(true) {
        if(leftCnt == 4) {
            int temp_y = y - dy[dir];
            int temp_x = x - dx[dir];
            if(temp_y < 0 || temp_y >= N || temp_x < 0 || temp_x >= M || board[temp_y][temp_x] == 1) {
                break;
            } else {
                y = temp_y;
                x = temp_x;
                one_flag = false;
                leftCnt = 0;
            }
        }


        if(one_flag) {
            cleanCnt++;
            board[y][x] = CLEAN;
        }

        
        int ndir = (dir + 3) % 4;
        int ny = y + dy[ndir];
        int nx = x + dx[ndir];
        if(ny < 0 || ny >= N || nx < 0 || nx >= M || board[ny][nx] == 1 || board[ny][nx] == CLEAN) {
            dir = ndir;
            one_flag = false;
            leftCnt++;
            continue;
        }

        if(board[ny][nx] == 0) {
            dir = ndir;
            y = ny;
            x = nx;
            one_flag = true;
            leftCnt = 0;
            continue;
        }

    }

    cout << cleanCnt;


    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~