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

 

14503번: 로봇 청소기

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

www.acmicpc.net

로봇 청소기가 청소할 방에 벽과 청소가 안되있는곳을 각각1, 0으로 표현한 2차원 배열이 주워진다.

조건에 맞게 로봇청소기가 움직였을때 청소한 칸의 갯수를 출력하는 문제이다.

문제에 주어진 경우들을 switch문으로 나누어서 재귀호출하는 형식으로 문제를 해결할 수 있었다.

 

#include<iostream>
using namespace std;
int area[50][50];
int n, m;
// 청소한 횟수
int howMany;
// (r,c)에서 d방향을 바라보고 지금까지 turn번 돌았음
void clean(int r, int c, int d, int turn) {
// 청소 안되있으면 한다
if (area[r][c] == 0) {
area[r][c] = 2;
howMany++;
}
// 한바퀴 돌았는데 진전이 없으면 후진하거나 종료하거나
if (turn == 4)
switch (d) {
case 0:
if (area[r + 1][c] == 1)
return;
return clean(r + 1, c, d, 0);
case 1:
if (area[r][c - 1] == 1)
return;
return clean(r, c - 1, d, 0);
case 2:
if (area[r - 1][c] == 1)
return;
return clean(r - 1, c, d, 0);
case 3:
if (area[r][c + 1] == 1)
return;
return clean(r, c + 1, d, 0);
}
// 왼쪽방향
int left;
if (d == 0)
left = 3;
else
left = d - 1;
// 돌아서 전진한다음 청소하거나, 그냥 돌기만 하거나
switch (left) {
case 0:
if (area[r - 1][c] == 0)
return clean(r - 1, c, 0, 0);
return clean(r, c, left, turn + 1);
case 1:
if (area[r][c + 1] == 0)
return clean(r, c + 1, 1, 0);
return clean(r, c, left, turn + 1);
case 2:
if (area[r + 1][c] == 0)
return clean(r + 1, c, 2, 0);
return clean(r, c, left, turn + 1);
case 3:
if (area[r][c - 1] == 0)
return clean(r, c - 1, 3, 0);
return clean(r, c, left, turn + 1);
}
}
int main() {
cin >> n >> m;
int x, y, dir;
cin >> y >> x >> dir;
howMany = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> area[i][j];
clean(y, x, dir, 0);
cout << howMany << endl;
}

코드 원본: https://github.com/sbl133/BOJ/blob/main/%2314503.cpp

 

GitHub - sbl133/BOJ

Contribute to sbl133/BOJ development by creating an account on GitHub.

github.com

댓글을 통한 코드리뷰, 질문, 지적 언제든 환영입니다!

+ Recent posts