본문 바로가기

Archived(CSE Programming)/알고리즘(C++)

백준 14503_로봇 청소기

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

시뮬레이션 문제 중에서도 쉬운 편에 속한다(고 한다... 나한테는 어렵다...)

기본적으로 문제가 주어진 조건에만 유의해서 코드로 옮기면 되는데 다만 방향에 대해서 주의해야 한다.

북 0 동 1 남 2 서 3 으로 주어지고 왼쪽 방향이라고 하면

d = (d + 3) % 4 로 탐색해야 하는데, 문제를 제대로 안읽고 (d + 1) % 4 를 통해 오른쪽 방향으로 탐색 했다.

이 외에는 정말 문제가 주어진 조건에만 유의하여 2-a,b / 2-c,d 조건으로 나눠서 풀면 어렵지 않게 해결이 가능하다.

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int mp[50][50]; // map
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };

int main() {
	// input
	int n, m, x, y, d, ans = 0;
	cin >> n >> m;
	cin >> x >> y >> d;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> mp[i][j];
	
	while (true) {
		// 빈칸
		if (mp[x][y] == 0){
			mp[x][y] = -1; // 청소
			ans++;
		}
		
		// 2-a,b 방향 찾기
		int cnt = 0;
		int nd = d;
		for (cnt = 0; cnt < 4; cnt++) {
			nd = (nd + 3) % 4; // 다음 방향
			int nx = x + dx[nd], ny = y + dy[nd]; // 다음 위치
			
			// 2-a 청소 가능하면
			if (mp[nx][ny] == 0) {
				x = nx, y = ny, d = nd; // 이동 방향 회전
				break; // 다음 이동
			}
		}

		// 2-c,d 방향 없을 경우
		if (cnt == 4) {
			int nd = (d + 2) % 4; // 반대 방향 후진
			int nx = x + dx[nd], ny = y + dy[nd]; // 후진
			
			// 2-d 벽인 경우
			if (mp[nx][ny] == 1)
				break;

			// 아닌 경우
			else
				x = nx, y = ny; // 후진
		}
	}
	cout << ans;
}

'Archived(CSE Programming) > 알고리즘(C++)' 카테고리의 다른 글

백준 15683_감시  (0) 2019.10.17
백준 14890_경사로  (0) 2019.10.16
백준 14891_톱니바퀴  (0) 2019.10.15
백준 14499_주사위 굴리기  (0) 2019.10.15
프로그래머스_입국심사  (2) 2019.10.09