[C++] 백준 14503번 : 로봇 청소기

2025. 6. 5. 00:13·공부/BAEKJOON
728x90

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

문제 요약


  • 방의 크기는 N x M
  • 방의 각 칸은 좌표 (r ,c)로 나타낸다.
  1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
  2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
    1. 바라보는 방향을 유지한 채로 한 칸 후진하고 1번으로 돌아간다.
    2. 바라보는 방향의 뒤쪽 칸이 벽이라면 작동을 멈춘다.
  3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
    1. 반시계 방향으로 90도 회전한다.
    2. 바라보는 방향의 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
    3. 1번으로 돌아간다.

입력과 출력


제출 답안


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

int N;
int M;

int r;
int c;
int d;


vector<vector<int>> v;
vector<int> vi;

int result = 0;//청소하는 칸의 수

void ClearHere();
void CheckFourDir();
bool IsWall(int x, int y);
bool CantClear(int x, int y);
bool isFinish = false;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M;//방의 크기
	cin >> r >> c >> d;//로봇청소기의 좌표, 방향(0:북,1:동,2:남,3:서)

	v.resize(N, vector<int>(M));

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> v[i][j];
		}
	}

	//처음에 청소
	ClearHere();

	return 0;
}

void ClearHere() {
	//주변 4방향 검사
	while (!isFinish) {
		if (v[r][c] == 0) {
			result++;
			v[r][c] = 2;//청소 완료
		}
		CheckFourDir();
	}
	return;
}

void CheckFourDir() {
	if (v[r - 1][c] == 0 || v[r][c - 1] == 0 || v[r + 1][c] == 0 || v[r][c + 1] == 0) {
		//빈 칸이 있는 경우
		d--;//반시계 방향으로 90도 회전
		if (d == -1) d = 3;

		bool cantMove = true;

		//앞으로 전진
		if (d == 0) cantMove = CantClear(r-1, c);
		else if (d == 1) cantMove = CantClear(r, c+1);
		else if (d == 2) cantMove = CantClear(r+1, c);
		else if (d == 3) cantMove = CantClear(r, c-1);

		if (cantMove) {//앞이 벽인 경우
			isFinish = false;
			return;
		}
		else {
			if (d == 0) r--;
			else if (d == 1)c++;
			else if (d == 2) r++;
			else if (d == 3) c--;
			isFinish = false; return;
		}
	}
	else {
		//빈 칸이 없는 경우 후진
		bool cantMove = true;

		//후진 가능한지 확인
		if (d == 0) cantMove = IsWall(r+1, c );
		else if (d == 1) cantMove = IsWall(r, c-1);
		else if (d == 2) cantMove = IsWall(r-1, c);
		else if (d == 3) cantMove = IsWall(r, c+1);

		if (cantMove)
		{//후진할 수 없는 경우
			cout << result;//결과 출력
			isFinish = true; return;
		}
		else {
			//1번으로 돌아간다.
			if (d == 0) r++;
			else if (d == 1) c--;
			else if (d == 2) r--;
			else if (d == 3) c++;
			isFinish = false; return;
		}
	}
}

bool CantClear(int x, int y) {
	return (v[x][y] == 1 || v[x][y] == 2);
}

bool IsWall(int x, int y) {
	return v[x][y] == 1;
}
728x90

'공부 > BAEKJOON' 카테고리의 다른 글

[C++] 백준 2578번 : 빙고  (0) 2025.05.26
[C++] 백준 11660번: 구간 합 구하기5  (0) 2025.01.14
[C++] 백준 11659번: 구간 합 구하기4  (0) 2025.01.12
[C++] 백준 1546: 평균  (1) 2025.01.11
[C++] 백준 11720: 숫자의 합  (0) 2025.01.11
'공부/BAEKJOON' 카테고리의 다른 글
  • [C++] 백준 2578번 : 빙고
  • [C++] 백준 11660번: 구간 합 구하기5
  • [C++] 백준 11659번: 구간 합 구하기4
  • [C++] 백준 1546: 평균
knhoo
knhoo
  • knhoo
    &*
    knhoo
  • 전체
    오늘
    어제
    • 전체 (143)
      • Unity 개발일지 (20)
        • [Unity2D]졸업프로젝트 (17)
        • [Unity3D]VR프로젝트 (2)
      • 공부 (118)
        • 게임 수학 (1)
        • 부트캠프 (12)
        • C++ (39)
        • Unity & C# (8)
        • 데이터베이스 (2)
        • 컴퓨터비전 (0)
        • 컴퓨터구조 (0)
        • python (7)
        • BAEKJOON (38)
        • 개발 (2)
        • 자료구조 (9)
      • 일상 (2)
  • 블로그 메뉴

    • Github
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 📖README
  • 인기 글

  • 태그

    비트버니
    Cpp
    패널파워
    야핏무브
    Python
    멋쟁이사자처럼후기
    자료구조
    머니워크
    앱테크
    백준 #python
    til
    캐시워크
    unity
    백준
    구간합
    오블완
    c#
    C++
    티스토리챌린지
    unity2d
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
knhoo
[C++] 백준 14503번 : 로봇 청소기
상단으로

티스토리툴바