14503 로봇 청소기
본문 바로가기
알고리즘 모음집/New 알고리즘

14503 로봇 청소기

by KyeongMin 2021. 3. 15.
728x90
반응형

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define NS 51 //가로 세로 크기
#define MS 51
int dy[] = { -1,0,1,0 };//0  1  2  3 
int dx[] = { 0,1,0,-1 };//북 동 남 서
int room[NS][MS];//청소해야하는 방
int cleanArea ;//청소한 구역 수
int N, M, r, c, d;//입력 : 가로, 세로, 로봇 위치 y,x, 로봇 방향
void init() {//초기화 및 초기 입력
	N = M = r = c = d = 0;
	cleanArea = 1;
	memset(room, 0, sizeof(room));
	scanf("%d %d", &N, &M);
	scanf("%d %d %d", &r, &c, &d);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &room[i][j]);
		}
	}
}
void robotStart() {//로봇의 동작
	while (1) {
		if (0 == room[r][c]) {//현재 위치를 청소한다.
			room[r][c] = ++cleanArea;
		}
		//현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
		int copyD = d;//4방향 검사후 그대로 방향 유지하기 위해서 
		int flag = 1;//4방향 검사 여부 확인 1이면 청소구역 없음
		for (int cleanCnt = 1; cleanCnt <= 4; cleanCnt++) {
			//왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
			copyD = ((--copyD) + 4)%4;
			int ny = r + dy[copyD]; int nx = c+ dx[copyD];
			if (0 == room[ny][nx]) {
				r = ny; c = nx;
				d = copyD;
				flag = 0;
				break;
			}
		}
		//왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
		if (flag) {//네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
			int ny = r - dy[d]; int nx = c - dx[d];
			if (1 != room[ny][nx]) {
				r = ny; c = nx;
			}
			else if (1 == room[ny][nx]) {//네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
				break;//종료
			}
		}
	}
}
int main(void) {
	int testCase = 1;
	//scanf("%d", &testCase);
	for (int tc = 1; tc <= testCase; tc++) {
		init();
		robotStart();
		//printf("#%d %d\n", tc, cleanArea-1);
		printf("%d\n", cleanArea-1);
	}
	return 0;
}

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

15686 치킨 배달  (0) 2021.03.16
14500 테트로미노  (0) 2021.03.16
14499 주사위 굴리기  (0) 2021.03.15
2607 비슷한 단어  (0) 2021.03.08
10971 외판원 순회 2  (0) 2021.03.05

댓글