[BOJ 14503] 로봇청소기

Leehyemin·2023년 3월 12일
0

알고리즘_백준

목록 보기
1/7
#include <iostream>
using namespace std;
// 14503 로봇청소기
// Created by polcomicepute

int N=0, M=0, r=0, c=0, d=0, back = 0,res =0;
int a[50][50];


int is_clean(int i, int j, int D[4][2]){
    for (int n=0; n<4; n++){    
        if ((D[n][0]>=0 && D[n][0]< N) && (D[n][1]>=0 && D[n][1]< M)){ //그리드 범위내
            if (a[D[n][0]][D[n][1]]==0)
                return 1; //빈칸 유무 return
        }
    }
    return 0;
}
int main(){
    
    cin >> N >> M;
    cin >> r >> c >> d;

    for(int i=0;i<N;i++) 
        for(int j=0; j<M ;j++)
            scanf("%1d",&a[i][j]); //한글자씩 받아서 a배열에 넣기


    int i = r, j=c;

    while (1){
        int D[4][2] ={{i-1,j},{i,j+1},{i+1, j},{i, j-1}};
        if (a[i][j]==0){
            a[i][j]=2;
            res ++; //청소 개수
        }
        

        if (is_clean(i,j,D)==0){ // if all 4 not clean 
            back = (d+2)%4; // 후진
            if (a[D[back][0]][D[back][1]] != 1){ //후진가능 
                i = D[back][0],j = D[back][1]; //후진 ㄱ ㄱ -> 그냥 이동임, 벽만 아니면 됨 
                continue; //1번 ㄱ 
            }
            else{ //후진 불가
                break;
            }
        }
        else{ // if 4 중 하나라도 clean
            d = (d+3)%4; //반시계 회전
            if (a[D[d][0]][D[d][1]] == 0){
                i = D[d][0],j = D[d][1];
                continue;
            }
        }
    }
    cout << res << endl;
    
    return 0;
}

// 여러 줄 입력: https://dbstndi6316.tistory.com/33
// 2차원 배열 반환 : ** .. .https://ciksiti.com/ko/chapters/11567-c--return-2d-array-from-function
//https://okky.kr/articles/1286917

0개의 댓글