본문 바로가기
Problem Solving/Baekjoon Online Judge

#14503 로봇 청소기

by 사향낭 2022. 1. 4.

문제 링크: https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

설명에 맞게 그냥 구현하기만 하면 된다.

 

방향에 유의할 것

 

#include <bits/stdc++.h>

using namespace std;

int dir_x[4] = {0, 1, 0, -1};
int dir_y[4] = {-1, 0, 1, 0};
int state[50][50];

int main() {
    int n, m;
    scanf("%d %d", &n, &m);

    int cur_x, cur_y, dir;
    scanf("%d %d %d", &cur_y, &cur_x, &dir);

    for (int y = 0; y < n; y++) {
        for (int x = 0; x < m; x++) {
            scanf("%d", &state[y][x]);
        }
    }

    int ret = 0;
    while (true) {
        if (state[cur_y][cur_x] == 0) {
            ret++;
            state[cur_y][cur_x] = 2;
        }

        bool keep = false;
        for (int i = 1; i <= 4; i++) {
            int new_x = cur_x + dir_x[(dir + 4 - i) % 4];
            int new_y = cur_y + dir_y[(dir + 4 - i) % 4];

            if (new_x < 0 || new_y < 0 || new_x == m || new_y == n) {
                continue;
            }

            if (state[new_y][new_x] == 0) {
                dir = (dir + 4 - i) % 4;
                cur_x = new_x;
                cur_y = new_y;
                keep = true;
                break;
            }
        }

        if (!keep) {
            int new_x = cur_x + dir_x[(dir + 2) % 4];
            int new_y = cur_y + dir_y[(dir + 2) % 4];

            if (new_x < 0 || new_y < 0 || new_x == m || new_y == n) {
                break;
            }

            if (state[new_y][new_x] == 1) {
                break;
            }

            cur_x = new_x;
            cur_y = new_y;
        }
    }

    printf("%d", ret);
   	return 0;
}

'Problem Solving > Baekjoon Online Judge' 카테고리의 다른 글

제1회 블롭컵  (0) 2022.03.01
#2749 피보나치 수  (0) 2022.01.10
#2933 미네랄  (0) 2022.01.08
#15683 감시  (0) 2022.01.06
#14809 경사로  (0) 2022.01.05

댓글