Study/Coding Test
[백준] 로봇 청소기
_gayeon
2021. 10. 21. 21:28
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int N, M; //세로 가로
int robot_r, robot_c, robot_d;
int answer;
int board[50][50];
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,1,0,-1 };
void init() {
}
void input() {
cin >> N >> M;
cin >> robot_r >> robot_c >> robot_d;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> board[i][j];
}
}
}
int getDir(int dir) {
if (dir == 0) return 3;
else if (dir == 1) return 0;
else if (dir == 2) return 1;
else return 2;
}
int back(int dir) {
if (dir == 0) return 2;
else if (dir == 2) return 0;
else if (dir == 1) return 3;
else return 1;
}
bool inRange(int r, int c) {
return r >= 0 && r < N && c >= 0 && c < M;
}
void solve() {
board[robot_r][robot_c] = 2;
answer++;
while (true) {
//인접한 칸 탐색
bool found = false;
for (int i = 0; i < 4; i++) {
int d = getDir(robot_d);
int nr = robot_r + dr[d];
int nc = robot_c + dc[d];
if (inRange(nr, nc) && board[nr][nc] == 0) {
robot_d = d;
robot_r = nr;
robot_c = nc;
found = true;
break;
}
else {
robot_d = d;
continue;
}
}
if (found) { //2-a
board[robot_r][robot_c] = 2;
answer++;
continue;
}
else {
int d = back(robot_d);
int nr = robot_r + dr[d];
int nc = robot_c + dc[d];
if (inRange(nr, nc) && board[nr][nc] != 1) { //2-c
robot_r = nr;
robot_c = nc;
continue;
}
else { //2-d
return;
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "r", stdin);
init();
input();
solve();
cout << answer << endl;
return 0;
}