티스토리 뷰

반응형

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

 

14503번: 로봇 청소기

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

www.acmicpc.net


⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 구현
  • 시뮬레이션

 


 

⊙ 문제 접근 과정

 

시뮬레이션 문제는 조건 그대로 구현만 하면 된다.

 

  1. 방문 안 했다면 청소 -> 방문 표시
  2. 청소하고 좌표 이동
  3. 반복, 만약 아무 곳도 청소 안 했다면 후진
  4. 다시 반복, 만약 후진 시 벽이면 종료

자세한 건 코드를 통해 확인하자


 

⊙ 문제 풀이

 

#include <iostream>

using namespace std;
#define MAX 51

int N, M;
int r, c, d;
int result=0;
int arr[MAX][MAX];
bool visited[MAX][MAX];

int dr[] = {-1,0,1,0};
int dc[] = {0,1,0,-1};

int main() {
    cin >> N >> M;

    cin >> r >> c >> d;

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

    while(true) {
        if(!visited[r][c]) result++; //청소
        visited[r][c] = true;

        bool flag = true; //아직 청소 안 함

        for(int i=1;i<=4;i++) {
            int nd = (4+d-i)%4;
            int nr = r + dr[nd];
            int nc = c + dc[nd];

            if(visited[nr][nc] || arr[nr][nc]) continue; //방문했거나 벽이면 처음으로

            flag = false; //청소했음을 표시
            r = nr; c = nc; d = nd;
            break;
        }

        if(flag) { //청소를 안 했다 (청소할 곳이 없음)
            //후진
            int nr = r + dr[(d+2)%4];
            int nc = c + dc[(d+2)%4];

            if(arr[nr][nc]) break; //후진시 벽이면 종료
            else {
                //벽이 아니면 후진
                r = nr;
                c = nc;
            }
        }
    }

    cout << result;
}

⊙ 결과

 


⊙ 마무리

 

 

NONE

 

하트 누르면 위 내용 전부 기억하게 됩니다.

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함