Problem Solving/백준

[삼성 SW 역량 테스트 기출 문제] 14503_로봇 청소기

돌돌김 2020. 2. 22. 22:44

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

그렇게 어려운 시뮬레이션은 아니었는데 문제를 잘못 읽어서 좀 헤맸다.

 

'd가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽을 바라보고 있는 것이다' 라는 것을 dy[], dx[]에 순서대로 넣어서 틀렸었다.

 

 

 

#include<iostream>
#include<queue>
#include<string.h>
#define MAX 51
using namespace std;
int map[MAX][MAX]; // 0: 빈칸, 1: 벽 , -1:청소한 칸
bool clean[MAX][MAX];
int dy[4] = { -1,0,1,0 }; // 0 :북쪽, 1:동쪽 2:남쪽 3:서쪽
int dx[4] = { 0,1,0,-1 };
int n, m;
int r, c, d;
int result;
void bfs(int y, int x) {
// 현재 위치 청소
result = 1;
map[y][x] = -1;
clean[y][x] = true;
queue<pair<int, int>>q;
q.push({ y,x });
while (!q.empty())
{
y = q.front().first;
x = q.front().second;
q.pop();
bool canClean = false; // 청소가능한 방이 있는지 확인
for (int k = 0; k < 4; k++) { // 4방향 탐색
d = (d + 3) % 4; // 현재 방향에서 왼쪽을 본다
int ny = y + dy[d];
int nx = x + dx[d];
if (0 <= ny && ny < n && 0 <= nx && nx < m && !clean[ny][nx]) {
if (map[ny][nx] == 0) { // 왼쪽 방향에 청소하지 않은 공간이 존재한다면 해당방향으로 진행
result++;
map[ny][nx] = -1;// 청소를 했음
clean[ny][nx] = true;
canClean = true;
q.push({ ny,nx });
break;
}
else { // 왼쪽 방향에 청소할 공간이 없음 -> 또 왼쪽방향으로 돌아가야 함
continue;
}
}
}
if (!canClean) { //청소를 못했다면 후진 가능한지 확인
int back = (d + 2) % 4;
int back_y = y + dy[back];
int back_x = x + dx[back];
if (0 <= back_y && back_y < n && 0 <= back_x && back_x < m) {
if (map[back_y][back_x] != 1) { // 벽이 아니라면, 후진 가능
q.push({ back_y,back_x });
if (map[back_y][back_x] == 0 && !clean[back_y][back_x]) {
clean[back_y][back_x] = true;
result++;
}
}
else { // 후진도 불가능 --> 작동을 멈춤
cout << result<<endl;
return;
}
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
cin >> r >> c >> d; // 로봇의 y좌표, x좌표, 방향
// 0 :북쪽, 1:동쪽 2:남쪽 3:서쪽
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
}
}
bfs(r, c);
}