본문 바로가기

Problem Solving/백준

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

내가 짠 코드

#include<iostream>
#include<stdio.h>
#include<vector>
#include<stack>
using namespace std;

// d가 0 1  2 3  북동남서
//      북
//   서    동
//      남
//현재방향 기준 왼쪽방향
/* 현재위치가 (r,c)
 0(북) : 서쪽방향 (r,c-1) 3 후진 : r+1,c : 3
 1(동) : 북쪽방향 (r-1,c) 0 후진 : r, c-1 : 0 
 2(남) : 동쪽방향 (r,c+1) 1 후진 : r-1,c : 1
 3(서) : 남쪽방향 (r+1,c) 2 후친 : r, c+1 : 2
*/
int N,M;
int totalClean=0;
int movement[4][3]={{0,-1,3},{-1,0,0},{0,1,1},{1,0,2}};
void step2(vector < vector < int > > location, int r, int c, int d);
int main(void){
    int r,c,d;

    scanf("%d %d",&N,&M);
    scanf("%d %d %d",&r,&c,&d);

    vector < vector < int > > location(N);

    int i,j,value;

    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            scanf("%d",&value);
            location[i].push_back(value);
        }
    }

    step2(location,r,c,d);

    cout << totalClean ;

    return 0;
}

void step2(vector < vector < int > > location, int r, int c, int d){
    if(location[r][c] == 0){ //현재위치 청소
        totalClean ++;
        location[r][c] = -1; //청소하면 -1로 업데이트
    }

    int i;
    int tr,tc,td=d;
    for(i=0;i<4;i++){
        tr = r+movement[td][0];
        tc = c+movement[td][1]; //왼쪽방향

        if(tr>=0 && tr<N && tc>=0 && tc<M && location[tr][tc]==0){ //청소가능한 구역이면
            step2(location,tr,tc,movement[td][2]); //위치 업데이트 하고 넘겨주기
            return;
        }

        td = movement[td][2];
    }
    td = movement[d][2];

    tr = r+movement[td][0];
    tc = c+movement[td][1];

    if(location[tr][tc]==1) return; //후진 안될때
    else step2(location,tr,tc,d); //후친하긔
}

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

'Problem Solving > 백준' 카테고리의 다른 글

[백준] 1009: 분산처리  (0) 2021.02.19
[백준] 1032: 명령 프롬프트  (0) 2021.02.19
[백준] 1026번: 보물  (0) 2021.02.19
[백준] 14499번: 주사위 굴리기  (0) 2021.02.01
[백준] 14891번: 톱니바퀴  (0) 2021.02.01