티스토리 뷰

문제 링크입니다.

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

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음

www.acmicpc.net

 

풀이 방법

주어진 조건을 그대로 구현하는 시뮬레이션 문제입니다.

 

로봇청소기가 청소한 영역과 청소하지 않은 영역을 구분하기 위해 isClean 배열을 사용합니다.

청소한 영역은 true가, 청소하지 않은 영역은 false가 return 됩니다.

, 벽이 위치하는 영역은 true가 return 되도록 합니다.

 

clean이라는 재귀함수를 이용하여 로봇청소기의 방향과 좌표를 조절합니다.

 

풀이

//
//  main.cpp
//  14503
//
//  Created by Jihye on 2020/04/26.
//  Copyright © 2020 Jihye Han. All rights reserved.
//

#include <iostream>

using namespace std;

int n, m; // 행, 열의 크기
int x, y; // 로봇청소기의 위치
int side; // 로봇청소기가 바라보는 방향 - 0 : 상, 1 : 우, 2 : 하, 3 : 좌
const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int map[50][50];
int ans = 1; // 청소 횟수
int turn = 0; // 한 자리에서의 회전 횟수
bool isClean[50][50];

void clean() {
    // 네 방향 모두 청소가 되어있거나 벽일 때
    if (turn == 4) {
        // 후진 좌표 탐색
        int nside = (side <= 1)? side + 2 : side - 2;
        x += dx[nside];
        y += dy[nside];
        
        // 후진이 가능할 때
        if (0 <= x && x < n && 0 <= y && y < m && map[x][y] == 0) {
            turn = 0;
            clean();
        }
        
        return;
    }
    
    // 현재 위치 청소
    isClean[x][y] = true;
    
    // 왼쪽 방향으로 회전하고, 좌표 확인
    side = (side == 0)? 3 : side - 1;
    int nx = x + dx[side];
    int ny = y + dy[side];
    
    // 왼쪽 방향에 아직 청소하지 않은 공간 존재
    if (nx >= 0 && nx < n && ny >= 0 && ny < m && isClean[nx][ny] == false) {
        x = nx;
        y = ny;
        turn = 0;
        ans++;
    } else { // 왼쪽 방향이 청소되었을 때
        turn++;
    }
    clean();
}

int main() {
    scanf("%d %d", &n, &m);
    scanf("%d %d %d", &x, &y, &side);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &map[i][j]);
            if (map[i][j] == 0) isClean[i][j] = false;
            else isClean[i][j] = true;
        }
    }
    clean();
    printf("%d\n", ans);
    
    return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함