본문 바로가기

Beakjoon/simulation

[백준] 14503번 로봇 청소기 (C++) - simulation

문제

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

코드

#include <iostream>

using namespace std;

int n,m,r,c,dir_num,cnt=0;
int arr[50][50];
bool cleaned[50][50];

int dy[4] = {-1,0,1,0};
int dx[4] = {0,1,0,-1};

bool inRange(int y, int x){
  return 0<=y&&y<n&&0<=x&&x<m;
}

void clean(int y, int x, int dir_num){
  if(!cleaned[y][x]){
    cnt++;
    cleaned[y][x]=true;
  }
  bool flag = true;
  for(int i=dir_num+3; i>=dir_num; i--){
    int ny=y+dy[i%4];
    int nx=x+dx[i%4];
    if(inRange(ny, nx)&&arr[ny][nx]==0&&!cleaned[ny][nx]){
      flag=false;
      clean(ny,nx,i%4);
      break;
    }
  }
  if(flag&&inRange(y-dy[dir_num],x-dx[dir_num])&&arr[y-dy[dir_num]][x-dx[dir_num]]==0) clean(y-dy[dir_num],x-dx[dir_num],dir_num);
}

int main(){
  cin >> n >> m >> r >> c >> dir_num;
  for(int i=0; i<n; i++){
    for(int j=0; j<m; j++){
      cin >> arr[i][j];
    }
  }
  clean(r, c, dir_num);
  cout << cnt;
  return 0;
}

정리

후진할 때 그 후진한 위치가 청소가 되어 있을 경우에는 카운트를 올려주지 말아야 한다. 이걸 놓쳐서 시간을 오래 걸린 문제였다.

참조