알고리즘

백준 1189번 컴백홈 (JAVA)

박카스마시며코딩 2023. 6. 29. 20:36

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

 

1189번: 컴백홈

첫 줄에 정수 R(1 ≤ R ≤ 5), C(1 ≤ C ≤ 5), K(1 ≤ K ≤ R×C)가 공백으로 구분되어 주어진다. 두 번째부터 R+1번째 줄까지는 R×C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다

www.acmicpc.net

 

저는 dfs를 이용해 문제를 해결하였습니다.

dfs를 통해 방문하지 않았던 지점의 경로를 탐색하고 그 depth가 k인 경우 1을 리턴하여 k의 길이의 경우의 수를 찾았습니다.

 

package BOJ.dfs;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_1189 {
    private static final char BLOCK = 'T';
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = stoi.apply(st.nextToken());
        int m = stoi.apply(st.nextToken());
        int k = stoi.apply(st.nextToken());
        char[][] map = new char[n][m];
        for(int i = 0 ; i < n ; i++){
            String command = br.readLine();
            for(int j = 0 ; j < m ; j++){
                map[i][j] = command.charAt(j);
            }
        }
        boolean[][] visited = new boolean[n][m];
        int result = cal(1,n-1,0,n,m,k,visited,map);
        System.out.println(result);
    }
    private static final int[] DY = {-1,0,1,0};
    private static final int[] DX = {0,1,0,-1};
    private static int cal(int depth, int y, int x, int n, int m, int k,boolean[][] visited,char[][] map) {
        if(depth == k && y == 0 && x == m-1){
            return 1;
        }
        if(depth >= k){
            return 0;
        }
        visited[y][x] = true;
        int result = 0;
        for(int i = 0 ; i < 4 ; i++){
            int ny = y + DY[i];
            int nx = x + DX[i];
            if(ny >= 0 && ny < n && nx >= 0 && nx < m && !visited[ny][nx] && map[ny][nx] != BLOCK){
                result += cal(depth+1,ny,nx,n,m,k,visited,map);
            }
        }
        visited[y][x] = false;
        return result;
    }
}