본문 바로가기

Algorithm

BOJ 14503번 로봇청소기 ( 구현 , DFS ) JAVA

BOJ 14503번 로봇청소기 ( 구현 , DFS ) JAVA


풀이

로봇 청소기가 청소한 곳을 못지나간다는 것으로 착각해서 해결하는데 시간이 좀 많이 들었던 것 같다.

지문을 읽는 것이 역시 젤 어렵다..

앞으로는 문제를 잘 읽어보잣!😀

 

링크

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

소스 코드


package boj;

import java.util.Scanner;

public class Boj14503 {
    static int n, m;
    static int[][] arr;
    static int[] dx = {-1,0,1,0};
    static int[] dy = {0,1,0,-1};
    static boolean[][] visited;
    static int res = 1;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int r, c, d;
        n = sc.nextInt();
        m = sc.nextInt();
        r = sc.nextInt();
        c = sc.nextInt();
        d = sc.nextInt();
        arr = new int[n][m];
        visited = new boolean[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] = sc.nextInt();
            }
        }
        visited[r][c] = true;
        dfs(r,c,d,arr,visited);

        System.out.println(res);


    }
    public static void dfs(int r,int c,int d,int[][] arr,boolean[][] visited) {
        int nextD = d;
        int nextR;
        int nextC;
        for (int i = 1; i <= 4; i++) {
            nextD--;
            if (nextD < 0) {
                nextD = 3;
            }
            nextR = r + dx[nextD];
            nextC = c + dy[nextD];
            if (((nextR >= 0) && (nextR < n) && (nextC >= 0) && (nextC < m)) && !visited[nextR][nextC]&&arr[nextR][nextC]!=1) {
                visited[nextR][nextC] = true;
                res++;
                dfs(nextR, nextC, nextD, arr, visited);
                return;
            }
        }
        int backD = nextD;
        for (int i = 1; i <= 2; i++) {
            backD--;
            if (backD < 0) {
                backD = 3;
            }
        }
        nextR = r + dx[backD];
        nextC = c + dy[backD];
        if (((nextR >= 0) && (nextR < n) && (nextC >= 0) && (nextC < m)) && arr[nextR][nextC]!=1) {
            dfs(nextR, nextC, nextD, arr, visited);
        }
    }

}