반응형
여러가지 기법이 혼합되어 있는 문제이다.
우선 전체 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;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
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 |