코드굽는 타자기

SWEA[1861] - 정사각형 방[D4] 본문

알고리즘/깊이&너비 우선 탐색(DFS&BFS)

SWEA[1861] - 정사각형 방[D4]

bright-jun 2020. 2. 13. 14:58

링크

SWEA[1861]

문제설명

  • DFS

문제풀이

  • DFS

문제코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;

public class Solution1861 {

    public static int Temp;
    public static int Temp_len;
    public static void DFS(int[] rc) {
        int nr=0;
        int nc=0;
        for (int d = 0; d < 4; d++) {
            nr = rc[0] + dir[d][0];
            nc = rc[1] + dir[d][1];
//            경계 안이고, 이동가능할 때
            if(nr>=0 && nr<N && nc>=0 && nc<N && map[rc[0]][rc[1]]+1==map[nr][nc]) {
                Temp++;
                DFS(new int[] {nr,nc});
                Temp--;
            }
        }
//        4방탐색 막혔을 경우
        Temp_len = Math.max(Temp_len, Temp);
    }

    public static int[][] dir = {
            {-1,0},
            {1,0},
            {0,-1},
            {0,1}
    };
    public static int Ans_len=Integer.MIN_VALUE;
    public static int Ans_map=Integer.MAX_VALUE;
    public static int[] Ans_ij;
    public static int N;
    public static int[][] map;
    public static void main(String args[]) throws Exception
    {
        System.setIn(new FileInputStream("res/swea/1861.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int T;
        T=Integer.parseInt(br.readLine().trim());

        for(int test_case = 1; test_case <= T; test_case++)
        {
            N = Integer.parseInt(br.readLine().trim());
            map = new int[N][N];

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

            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    Temp_len=0;
                    Temp=0;
                    DFS(new int[] {i,j});    //Temp_len가 최대값
                    if(Ans_len<Temp_len) {
                        Ans_len=Temp_len;
                        Ans_map=map[i][j];
                        Ans_ij = new int[] {i,j};
                        int debug=0;
                    }
//                    길이같은방 여럿일 경우 작은거
                    else if(Ans_len==Temp_len && Ans_map>map[i][j]) {
                        Ans_map=map[i][j];
                        Ans_ij = new int[] {i,j};
                        int debug=0;
                    }
                }
            }

            System.out.println("#"+test_case+" "+Ans_map+" "+(Ans_len+1));

            /*
             * 초기화
             */
            Ans_len=Integer.MIN_VALUE; 
            Ans_map=Integer.MAX_VALUE;     

        }
    }
}

아쉬운점

  • 출력조건 제대로 안봐서 i,j 좌표 출력하려고 Ans_ij변수 만듦
  • 방 길이는 자신도 포함임 test_case보면 추측 가능 
    • Ans+1
  • Visit check 안해줘도됨.
    • 한칸 올라갔으면 그 뒤로는 한칸 내려가야하기때문에 

잘한점

  • DFS

'알고리즘 > 깊이&너비 우선 탐색(DFS&BFS)' 카테고리의 다른 글

Baekjoon[7569] - 토마토  (0) 2020.02.14
Baekjoon[17471] - 게리맨더링  (0) 2020.02.14
SWEA[1949] - 등산로 조성  (0) 2020.02.11
Jungol[1462] - 보물섬  (0) 2020.02.11
SWEA[1953] - 탈주범 검거  (0) 2020.02.10
Comments