학부 연구생 민상 21922

LJM·2023년 7월 28일
0

백준풀기

목록 보기
206/259

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

BFS 로 풀었다 코드가 너무 크다

import java.util.*;
import java.io.*;

class Node{
    int r;
    int c;

    int dir;//0, 1, 2, 3

    Node(int r, int c, int dir){
        this.r = r;
        this.c = c;
        this.dir = dir;
    }
}
public class Main {

    static int n;
    static int m;

    static int[][] lab;

    static boolean[][] visit;

    static int answer = 0;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");
        n = Integer.parseInt(input[0]);
        m = Integer.parseInt(input[1]);

        lab = new int[n][m];

        ArrayList<Node> startlist = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            input = br.readLine().split(" ");
            for (int j = 0; j < m; j++) {
                lab[i][j] = Integer.parseInt(input[j]);

                if(lab[i][j] == 9){
                    startlist.add(new Node(i, j, 0));
                }

            }
        }

        visit = new boolean[n][m];


        for(Node start : startlist){
            bfs(start.r, start.c);
        }


        System.out.println(answer);
    }

    public static void bfs(int sr, int sc){


        Queue<Node> que = new LinkedList();

        if(visit[sr][sc] == false){
            visit[sr][sc] = true;
            answer++;
        }

        int[][] dir = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

        for (int i = 0; i < 4; i++) {
            int nr = sr + dir[i][0];
            int nc = sc + dir[i][1];

            if(nr < 0 || nr >= n || nc < 0 || nc >= m)
                continue;

            int nd = i;
            if(lab[nr][nc] == 1){
                if(i == 1)
                    nd = 3;
                else if(i == 3)
                    nd = 1;
            }else if(lab[nr][nc] == 2){
                if(i == 0){
                    nd = 2;
                }else if(i == 2)
                    nd = 0;
            } else if(lab[nr][nc] == 3){
                if(i == 0){
                    nd = 1;
                }else if(i == 1){
                    nd = 0;
                }else if(i == 2){
                    nd = 3;
                }else if(i == 3){
                    nd = 2;
                }
            } else if(lab[nr][nc] == 4){
                if(i == 0){
                    nd = 3;
                }else if(i == 1){
                    nd = 2;
                }else if(i == 2){
                    nd = 1;
                }else if(i == 3){
                    nd = 0;
                }
            }

            que.add(new Node(nr, nc, nd));

            if(visit[nr][nc] == false){
                visit[nr][nc] = true;
                answer++;
            }
        }

        while(que.isEmpty() == false){

            Node cur = que.poll();

            int nr = cur.r + dir[cur.dir][0];
            int nc = cur.c + dir[cur.dir][1];

            if(nr < 0 || nr >= n || nc < 0 || nc >= m)
                continue;

            if(lab[nr][nc] >=0 && lab[nr][nc] <= 4 && false == visit[nr][nc])
                answer++;

            if(lab[nr][nc] == 0){
                que.add(new Node(nr, nc, cur.dir));
                visit[nr][nc] = true;
            }else if(lab[nr][nc] == 1){
                int nd = cur.dir;
                if(cur.dir == 1){
                    nd = 3;
                }else if(cur.dir == 3)
                    nd = 1;

                que.add(new Node(nr, nc, nd));
                visit[nr][nc] = true;
            }
            else if(lab[nr][nc] == 2){
                int nd = cur.dir;
                if(cur.dir == 0){
                    nd = 2;
                }else if(cur.dir == 2)
                    nd = 0;

                que.add(new Node(nr, nc, nd));
                visit[nr][nc] = true;
            }
            else if(lab[nr][nc] == 3){
                int nd = cur.dir;
                if(cur.dir == 0){
                    nd = 1;
                }else if(cur.dir == 3)
                    nd = 2;
                else if(cur.dir == 1)
                    nd = 0;
                else if(cur.dir == 2)
                    nd = 3;

                que.add(new Node(nr, nc, nd));
                visit[nr][nc] = true;

            }else if(lab[nr][nc] == 4){
                int nd = cur.dir;
                if(cur.dir == 0){
                    nd = 3;
                }else if(cur.dir == 1)
                    nd = 2;
                else if(cur.dir == 2)
                    nd = 1;
                else if(cur.dir == 3)
                    nd = 0;

                que.add(new Node(nr, nc, nd));
                visit[nr][nc] = true;
            }


        }
    }


}
profile
게임개발자 백엔드개발자

0개의 댓글