Muscardinus

로봇청소기 본문

알고리즘 문제/[삼성 SW 역량 테스트 기출 문제]

로봇청소기

Muscardinus 2020. 8. 24. 16:59
728x90

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

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

#include <iostream>
#include <queue>

using namespace std;

struct Robot {
	int rx, ry, rd;
	Robot(int y, int x, int d) {
		ry = y; rx = x; rd = d;
	}
};

int n, m;
int board[51][51];
int result = 0;

int dy[] = {-1,0,1,0};
int dx[] = {0,1,0,-1};

int main() {
	ios_base::sync_with_stdio(false);
	cin >> n >> m;
	int rx, ry, rd;
	cin >> ry >> rx >> rd;

	for (int y = 0; y < n; y++) {
		for (int x = 0; x < m; x++) {
			cin >> board[y][x];
		}
	}

	queue<Robot> Q;
	Q.push(Robot(ry,rx,rd));
	while (!Q.empty()) {
		int nowY = Q.front().ry;
		int nowX = Q.front().rx;
		int nowD = Q.front().rd;
		if (board[nowY][nowX] == 0) {
			board[nowY][nowX] = 2;
			result++;
		}
		Q.pop();
		for (int i = 0; i < 4; i++) {
			int nextD = (nowD + 3 - i) % 4;
			int nextY = nowY + dy[nextD];
			int nextX = nowX + dx[nextD];
			if (nextY < 0 || nextY >= n || nextX < 0 || nextX >= m || board[nextY][nextX] != 0) continue;
			
			Q.push(Robot(nextY,nextX,nextD));
			break;
		}
		if (Q.empty()) {
			int nextD = nowD;
			int nextY = nowY + dy[(nextD + 2) % 4];
			int nextX = nowX + dx[(nextD + 2) % 4];
			if (nextY < 0 || nextY >= n || nextX < 0 || nextX >= m || board[nextY][nextX] == 1) break;

			Q.push(Robot(nextY, nextX, nextD));
		}
	}

	cout << result<<"\n";
	return 0;
}
728x90

'알고리즘 문제 > [삼성 SW 역량 테스트 기출 문제]' 카테고리의 다른 글

경사로  (0) 2020.08.26
스타트와 링크  (0) 2020.08.25
연구소  (0) 2020.08.23
테트로미노  (0) 2020.08.22
주사위 굴리기  (0) 2020.08.21
Comments