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[]에 순서대로 넣어서 틀렸었다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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); | |
} |
'Problem Solving > 백준' 카테고리의 다른 글
[백준 BOJ] 5427 - 불 (0) | 2020.02.27 |
---|---|
[삼성 SW 역량 테스트 기출 문제] 14502_연구소 (0) | 2020.02.22 |
[삼성 A형 기출 문제] 17281 - ⚾ (0) | 2020.02.17 |
[삼성 SW 역량 테스트 기출 문제] 17779_게리맨더링 2 (0) | 2020.02.07 |
[백준 BOJ] 11559_Puyo Puyo (0) | 2020.01.24 |