반응형
https://www.acmicpc.net/problem/16946
하나의 정점에서 BFS를 탐색을 한다면 시간초과걸린다 일단 모든 정점을 0으로 이어저있는칸의 구간별로 개수를 센다. 이렇게 모든 값을 매긴다음 1을 기준으로 구역이 인접해있는지센다. 잇때 set을 쓰는데 같은 구역에서는 중복해서 더하면 안되기 때문이다. 이런 최적화 문제도 자주 푸는것이 좋을거 같다.
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
|
package day0311;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.TreeSet;
public class B16946 {
static int N, M;
static char[][] map;
static int[][] Answer;
static int[][] cntMap;
static int dy[] = { 1, -1, 0, 0 };
static int dx[] = { 0, 0, 1, -1 };
static ArrayList<Integer> cnt = new ArrayList<Integer>();
static int num;
static class Pair {
int y;
int x;
public Pair(int y, int x) {
super();
this.y = y;
this.x = x;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
cnt.add(0);
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new char[N][M];
Answer = new int[N][M];
cntMap = new int[N][M];
num = 1;
for (int i = 0; i < N; i++) {
map[i] = br.readLine().toCharArray();
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == '0' && cntMap[i][j]==0) {
cntMap[i][j] = num;
Queue<Pair> q = new LinkedList<>();
q.add(new Pair(i, j));
int thisCnt =0;
while (!q.isEmpty()) {
Pair cur = q.poll();
thisCnt++;
for (int d = 0; d < 4; d++) {
int ny = cur.y + dy[d];
int nx = cur.x + dx[d];
if (ny < 0 || nx < 0 || ny >= N || nx >= M)
continue;
if (map[ny][nx] == '1')
continue;
if (cntMap[ny][nx] != 0)
continue;
cntMap[ny][nx] = num;
q.add(new Pair(ny, nx));
}
}
cnt.add(thisCnt);
num++;
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(map[i][j]=='1') {
TreeSet<Integer> set = new TreeSet<Integer>();
for(int d=0;d<4;d++) {
int ny = i+dy[d];
int nx = j+dx[d];
if(ny<0||nx<0||ny>=N||nx>=M)continue;
if(cntMap[ny][nx]==0)continue;
set.add(cntMap[ny][nx]);
}
Iterator<Integer> it = set.iterator();
while(it.hasNext()) {
}
}else {
sb.append(0);
}
}
sb.append("\n");
}
System.out.print(sb.toString());
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
반응형
'ProgramSoliving' 카테고리의 다른 글
백준 : 12886 (0) | 2020.03.15 |
---|---|
백준 : 1086 JAVA (0) | 2020.03.14 |
백준 : 10217 (0) | 2020.03.08 |
벨만포드 알고리즘 : 백준 11657 ( 타임머신) (0) | 2020.03.08 |
백준 : 1039 JAVA (0) | 2020.03.07 |