Algorithm

[BOJ] 1941. 소문난 칠공주

프로그래민 2020. 4. 2. 00:19
반응형

여러가지 기법이 혼합되어 있는 문제이다.

우선 전체 25개의 알파벳중 7개를 뽑는 경우의 수를 생각하였다. 백트래킹을 이용한 조합을 사용할 계획으로 7개의 알파벳을 고르는 것을 구현한 후 1차적으로 S가 4개 이상인지를 확인하였다. 그 다음 S가 4개이상임이 확인이 된다면 BFS를 이용하여 7개의 알파벳이 하나의 그룹으로 이루어져있는지 확인하였다. 만일 하나의 그룹이면 최종답을 하나추가 시켰다.

수의 범위가 구현이 가능한 범위임으로 문제에 주어진 대로 구현하는게 중요한 문제였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package selfStudy.chap07;
 
 
public class Main_bj_1941_소문난칠공주  {
    
    static char[][] map;
    static int[] arr;
    static int[] result;
    static boolean[] visitForComb;
    
    
    static int[] di= {-1,0,1,0};
    static int[] dj= {0,1,0,-1};
    
    static int[][] mapForBFS;
    static boolean[][] visitForBFS;
    
    static Queue<Pos> queue;
    
    static class Pos{
        int i,j;
        public Pos(int i,int j) {
            this.i=i;this.j=j;
        }
    }
    
    static int answer;
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        map=new char[5][5];
        arr=new int[25];
        for(int i=0;i<25;i++)
            arr[i]=i;
        visitForComb=new boolean[25];
        result=new int[7];
    
        for(int i=0;i<5;i++) {
            String str = br.readLine();
            for(int j=0;j<5;j++)
                map[i][j]=str.charAt(j);
        }
        
        answer=0;
        comb(0,0);
        System.out.println(answer);
    }
    
    static void comb(int start,int count) {
        if(count==7) {
            if(check()) {
                if(bfs())
                    answer++;
            }
            return;
        }
        for(int i=start;i<25;i++) {
            if(visitForComb[i]==false) {
                visitForComb[i]=true;
                result[count]=arr[i];
                comb(i, count+1);
                visitForComb[i]=false;
            }
        }
    }
    
    static boolean check() {    //result에 S가 4개인지 확인
        int count=0;
        for(int i=0;i<7;i++) {
            if(map[result[i]/5][result[i]%5]=='S')
                count++;
            if(count>=4)
                return true;
        }
        return false;
    }
    
    static boolean bfs() {
        visitForBFS=new boolean[5][5];
        mapForBFS=new int[5][5];
        queue=new LinkedList<>();
        
        for(int i=0;i<7;i++) {
            mapForBFS[result[i]/5][result[i]%5]=1;
        }
        
        
        for(int i=0;i<5;i++) {
            for(int j=0;j<5;j++) {
                if(mapForBFS[i][j]==1 &&visitForBFS[i][j]==false ) {
                    queue.offer(new Pos(i, j));
                    visitForBFS[i][j]=true;
                    int count=0;
                    while(!queue.isEmpty()) {
                        Pos cur = queue.poll();
                        count++;
                        for(int dir=0;dir<4;dir++) {
                            int nextI = cur.i+di[dir];
                            int nextJ = cur.j+dj[dir];
                            
                            if(nextI<0||nextI>=5 ||nextJ<0|| nextJ>=5)
                                continue;
                            
                            if(mapForBFS[nextI][nextJ]==1 && visitForBFS[nextI][nextJ]==false) {
                                queue.offer(new Pos(nextI, nextJ));
                                visitForBFS[nextI][nextJ]=true;
                            }
                        }
                    }
                    
                    if(count==7)
                        return true;
                    else
                        return false;
                    
                }
            }
        }
        
        return false;
        
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
                                    

 

반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 6588. 골드바흐의 추측  (0) 2020.04.04
[SWEA] 5607. 조합  (0) 2020.04.03
[BOJ] 14891. 톱니바퀴  (0) 2020.03.31
[BOJ] 13335. 트럭  (0) 2020.03.31
[BOJ] 14999. 주사위 굴리기  (0) 2020.03.31