문제
로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 방은 �×� 크기의 직사각형으로 나타낼 수 있으며, 1×1 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 (�,�) 로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 (0,0) , 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 (�−1,�−1) 이다. 즉, 좌표 (�,�) 는 북쪽에서 (�+1) 번째에 있는 줄의 서쪽에서 (�+1) 번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
- 현재 칸의 주변 4 칸 중 청소되지 않은 빈 칸이 없는 경우,
- 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
- 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
- 현재 칸의 주변 4 칸 중 청소되지 않은 빈 칸이 있는 경우,
- 반시계 방향으로 90∘ 회전한다.
- 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
- 1번으로 돌아간다.
입력
첫째 줄에 방의 크기 � 과 � 이 입력된다. (3≤�,�≤50) 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 (�,�) 와 처음에 로봇 청소기가 바라보는 방향 � 가 입력된다. � 가 0 인 경우 북쪽, 1 인 경우 동쪽, 2 인 경우 남쪽, 3 인 경우 서쪽을 바라보고 있는 것이다.
셋째 줄부터 � 개의 줄에 각 장소의 상태를 나타내는 �×� 개의 값이 한 줄에 � 개씩 입력된다. � 번째 줄의 � 번째 값은 칸 (�,�) 의 상태를 나타내며, 이 값이 0 인 경우 (�,�) 가 청소되지 않은 빈 칸이고, 1 인 경우 (�,�) 에 벽이 있는 것이다. 방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다. 로봇 청소기가 있는 칸은 항상 빈 칸이다.
출력
로봇 청소기가 작동을 시작한 후 작동을 멈출 때까지 청소하는 칸의 개수를 출력한다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int _y[] = { -1,0,1,0 };
int _x[] = { 0,1,0,-1 };
int area[51][50] = { 0, };
int N, M, r, c, d;
int ret = 0;
cin >> N >> M;
cin >> r >> c >> d;
for (int n = 0; n < N; n++)
{
for (int m = 0; m < M; m++)
{
cin >> area[n][m];
}
}
bool move = true;
do {
//1
if (area[r][c] == 0) {
area[r][c] = 2;
ret++;
}
//3
bool flag = false;
for (int dir = 0; dir < 4 && flag == false; dir++)
{
int ny = r + _y[dir], nx = c + _x[dir];
if (ny >= N || ny < 0 || nx >= M || nx < 0) continue;
if (area[ny][nx] == 0)
{
flag = true;
//3.1
switch (d)
{
case 0: d = 3;
break;
default: d -= 1;
}
//3.2
if (area[r + _y[d]][c + _x[d]] == 0)
{
r = r + _y[d], c = c + _x[d];
break;
}
}
}
//2
if (!flag)
{
//2.1
int ny = r - _y[d], nx = c - _x[d];
if (ny >= N || ny < 0 || nx >= M || nx < 0)
{
move = false;
break;
}
if (area[ny][nx] != 1)
{
r = r - _y[d], c = c - _x[d];
}
else {
move = false;
break;
}
}
} while (move);
cout << ret << endl;
return 0;
}
'Coding Test' 카테고리의 다른 글
[백준] 21736 헌내기는 친구가 필요해 (0) | 2024.04.11 |
---|---|
[백준]23291 어항정리 (0) | 2024.04.10 |
[백준]2961 도영이가 만든 맛있는 음식 (0) | 2023.04.08 |
[백준]23291 어항 정리 (시간초과) (0) | 2022.04.30 |
[백준]17837 새로운 게임2 (0) | 2022.04.28 |