https://www.acmicpc.net/problem/2583
#2583: 지역 찾기
첫 번째 줄에는 M, N, K가 공백을 두고 차례로 지정됩니다. M, N, K는 모두 100보다 작거나 같은 자연수이다. 두 번째 행부터 시작하는 K행에서 x, y 좌표값은 직사각형의 왼쪽 하단 모서리와
www.acmicpc.net
1) 정사각형 부분을 1로 설정합니다.
2) 건 게이트를 돌아 다니며 dfs를 실행하면서 카운트를 0으로 초기화하십시오! 이 시점에서 카운트는 면적을 계산하는 데 사용됩니다.
3) dfs를 실행하는 동안 +1을 세십시오.
4) 도착 목록에 번호를 입력합니다.
5) 스냅 목록의 개수는 구획의 개수가 되고 값은 구획의 너비가 됩니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static int()() arr;
static int m, n, k,count;
static int() dx = { 1, -1, 0, 0 };
static int() dy = { 0, 0, 1, -1 };
public static void main(String() args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int(m)(n);
for (int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
int lx = Integer.parseInt(st.nextToken());
int ly = Integer.parseInt(st.nextToken());
int rx = Integer.parseInt(st.nextToken());
int ry = Integer.parseInt(st.nextToken());
for (int j = ly; j <ry; j++) {
for (int z = lx; z <rx; z++) {
arr(j)(z) = 1;
}
}
}
ArrayList<Integer> arrlist = new ArrayList<>();
for (int j = 0; j < m; j++) {
for (int z = 0; z < n; z++) {
if(arr(j)(z)==0) {
count=0;
find(j,z);
arrlist.add(count);
}
}
}
Collections.sort(arrlist);
StringBuilder sb = new StringBuilder();
sb.append(arrlist.size()).append("\n");
for(int i:arrlist) {
sb.append(i).append(" ");
}
System.out.println(sb);
}
static void find(int x, int y) {
arr(x)(y)=1;
count++;
for(int i=0;i<4;i++) {
int xx = x+dx(i);
int yy=y+dy(i);
if(xx>=0&&yy>=0&&xx<m&&yy<n) {
if(arr(xx)(yy)==0) {
find(xx,yy);
}
}
}
}
}