-
백준(BOJ) 14503번 로봇 청소기알고리즘 풀이/백준(Boj) 2019. 8. 30. 15:25
문제 : https://www.acmicpc.net/problem/14503
문제로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
풀이:
재귀호출을 통한 완전 탐색으로 풀어 보았다. 주의할 점은 막힌 곳이 있어도 후진 할 곳만 있다면 즉 벽만 아니라면 진행이 가능 하다는 점이다. 각 a, b, c, d 조건을 주석에 달아 놓았다.
코드 (C ++ )
#include <iostream>
using namespace std;
//북동남서
const int dy[4] = { -1,0,1,0 };
const int dx[4] = { 0,1,0,-1 };
int room[50][50];
int N, M;
int visited[50][50];
int ret;
void solve(int y, int x, int d)
{
if (!visited[y][x]) {
visited[y][x] = true;
ret++;
}
for (int i = 0; i < 4; ++i)
{
//조건 b
d = (d + 3) % 4;
int ny = y + dy[d];
int nx = x + dx[d];
//조건 a
if (ny >= 0 && nx >= 0 && !visited[ny][nx] && !room[ny][nx]) {
solve(ny, nx, d);
return;
}
}
//c if문 4개
if (d == 0) {
int ny = y + 1;
//뒤쪽 갈수있다면
if (x >= 0 && ny >= 0 && ny < N && x < M && !room[ny][x]) {
solve(ny, x, d);
return;
}
}
else if (d == 1) {
int nx = x - 1;
if (nx >= 0 && y >= 0 && y < N && nx < M && !room[y][nx]) {
solve(y, nx, d);
return;
}
}
else if (d == 2) {
int ny = y - 1;
if (x >= 0 && ny >= 0 && ny < N && x < M && !room[ny][x]) {
solve(ny, x, d);
return;
}
}
else if (d == 3) {
int nx = x + 1;
if (nx >= 0 && y >= 0 && y < N && nx < M && !room[y][nx]) {
solve(y, nx, d);
return;
}
}
// c에 if문 다 만족 못할 시 d
return;
}
int main()
{
cin >> N >> M;
int robotY, robotX, robotDir;
cin >> robotY >> robotX >> robotDir;
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j)
cin >> room[i][j];
solve(robotY, robotX, robotDir);
cout << ret << "\n";
return 0;
}
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 1904 01타일 (0) 2019.09.02 백준(BOJ) 14891번 톱니바퀴 (0) 2019.09.01 백준(BOJ) 14889번 스타트와 링크 (0) 2019.08.29 백준(BOJ) 17144번 미세먼지 안녕! (0) 2019.08.26 백준(BOJ) 15685번 드래곤 커브 (0) 2019.08.24