백준(C, C++)/골드

백준 14503: 로봇 청소기 [C/C++], 삼성 코딩 테스트

치킨먹고싶어요 2022. 6. 12. 11:25

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

#include <iostream>
using namespace std;
int wall[55][55]; // 벽
int clean[55][55]; // 청소 유무
int dy[4= {-1010}; // 북 동 남 서
int dx[4= {010-1};
int ry, rx; int way; int cnt = 1;
int n, s;
void input();
void solve(int y, int x);
int main(){
    input();
    solve(ry, rx);
    printf("%d", cnt);
}
void input(){
    scanf("%d %d"&n, &s);
    scanf("%d %d"&ry, &rx); scanf("%d"&way);
    for(int j = 0; j < n; j++){
        for(int i = 0; i < s; i++) {
            scanf("%d"&wall[j][i]);
        }
    }
}
void solve(int y, int x){
    clean[y][x] = 1;
     int blocked = 0;
    for(int i = 0; i < 4; i++) {
        if (clean[y + dy[i]][x + dx[i]] or wall[y + dy[i]][x + dx[i]] or (y + dy[i] >= n or y + dy[i] < 0 or x + dx[i] >= s or x + dx[i] < 0)){ // 청소 되었거나 벽이거나 범위를 벗어난다면
            blocked++;
        }
    }
    if (blocked == 4) { // 모든 방향이 청소 되었거나 벽이거나 범위를 벗어났다.
        if (y - dy[way] >= n or y - dy[way] < 0 or x - dx[way] >= s or x - dx[way] < 0){ // 범위를 벗어났다
            return;
        }
        if (wall[y - dy[way]][x - dx[way]]) { // 벽이다
            return;
        }
        else//후진한다
            solve(y - dy[way], x - dx[way]);
        }
    }
    else { // 청소해야할 범위가 있다.
        way -= 1; way = (way < 0 ? 3 : way); // 왼쪽으로 회전한다.
        if (!clean[y + dy[way]][x + dx[way]] and !wall[y + dy[way]][x + dx[way]] and !(y + dy[way] >= n or y + dy[way] < 0 or x + dx[way] >= s or x + dx[way] < 0)) { // 청소가 되지 않았으며 벽이 아니며 범위를 벗어나지 않았을때
            solve(y + dy[way], x + dx[way]); cnt++;
        }
        else { // 같은 자리에서 회전한다.
            solve(y, x);
        }
    }
}
 
cs

풀이

시뮬레이션 입니다