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;
}