ALGORITHM

[JAVA] 백준 14500번- 테트로미노

연듀 2022. 11. 17. 22:10

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
    static int[][] arr;
    static int n, m;
    static boolean[][] visit;
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static int max = Integer.MIN_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
         n = Integer.parseInt(st.nextToken());
         m = Integer.parseInt(st.nextToken());

         arr = new int[n][m];
         visit = new boolean[n][m];

         for(int i=0; i<n; i++){
             st = new StringTokenizer(br.readLine());
             for(int j=0; j<m; j++){
                 arr[i][j] = Integer.parseInt(st.nextToken());
             }
         }

         for(int i=0; i<n; i++){
             for(int j=0; j<m; j++){
                 visit[i][j] = true;
                 dfs(i, j, 1, arr[i][j]);
                 visit[i][j] = false;
                 dfs2(i, j, 1, arr[i][j], 0);
             }
         }
        System.out.println(max);
    }

    static void dfs2(int x, int y, int cnt, int sum, int start){

        if(cnt == 4){
            max = Math.max(max, sum);
            return;
        }
        for(int i=start; i<4; i++){
            int nx = x+dx[i];
            int ny = y+dy[i];

            if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
            dfs2(x, y, cnt+1, sum+arr[nx][ny], i+1);
        }
    }

    static void dfs(int x, int y, int cnt, int sum){
        if(cnt == 4){
            max = Math.max(max, sum);
            return;
        }

        for(int i=0; i<4; i++){
            int nx = x + dx[i];
            int ny = y + dy[i];

            if(nx<0 || nx>=n || ny<0 || ny>=m || visit[nx][ny]) continue;

            visit[nx][ny] = true;
            dfs(nx, ny, cnt+1, sum+arr[nx][ny]);
            visit[nx][ny] = false;
        }
    }
}

 

 

보라색깔 도형의 경우 기존 dfs로는 찾을 수 없다.

맨 가운데 (x,y)를 기준으로 해 세 방향으로 뻗어나가도록 해야한다.

그렇게 하기 위해 (x, y)로부터 위, 아래, 오른쪽, 아래쪽의 방향 중 세방향을 겹치지 않게 탐색하게 한다.

 

 

 

 

'ALGORITHM' 카테고리의 다른 글

[JAVA] 백준 2875 - 대회 or 인턴  (0) 2022.11.22
[JAVA] 백준 11047 - 동전 0  (0) 2022.11.22
[JAVA] 백준 1107 - 리모컨  (0) 2022.11.17
[JAVA] 백준 6064 - 카잉 달력  (0) 2022.11.16
[JAVA] 백준 1748 - 수 이어 쓰기 1  (0) 2022.11.13