본문 바로가기

Algorithm/DFS

(C++) - 백준(BOJ) 14503번 : 로봇청소기 답

반응형

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

dfs를 이용한 구현문제였습니다.

 

풀이방법

 나와 있는 조건을 검사하며 구현하시면 됩니다

 

Code

#include <bits/stdc++.h>
using namespace std;
int n,m;
int board[11][11];
int ck[11][11];
//북 동 남 서
int dx[] = {-1, 0, 1,0};
int dy[] = {0, 1, 0,-1};
int area[51][51];
int visited[51][51];
int ans;
struct robotInfo{
    int row, col, curDir;
};
robotInfo robot;
void dfs(int row, int col, int curDir, int curCnt){
    if(curCnt>=4){
        int x = row - dx[curDir];
        int y = col - dy[curDir];
        if(0 > x || x >= n || 0 > y || y >= m || area[x][y] != 2) return; 
        dfs(x,y,curDir,0);
        return;
    }
    area[row][col] = 2;
    int newDir = ((curDir-1) + 4) % 4; //왼쪽으로 틀기
    int nx = row + dx[newDir];
    int ny = col + dy[newDir];
    if(0 > nx || nx >= n || 0 > ny || ny >= m) return;
    if(area[nx][ny] == 0) dfs(nx,ny,newDir,0);
    else dfs(row,col,newDir,curCnt+1);
}

int main(){
    cin >> n >> m;
    cin >> robot.row >> robot.col >> robot.curDir;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> area[i][j];
        }
    }
    dfs(robot.row,robot.col,robot.curDir,0);
    for(int i =0 ;i <n; i++){
        for(int j = 0 ;j <m;j++){
            if(area[i][j]==2) ans++;
        }
    }
    cout << ans <<'\n';
}