단지번호붙이기(2667)
Last updated
Last updated
3
7
8
9//bfs
import java.util.*;
import java.io.*;
public class Main{
static int n, vnum=0;
static int[] varr = new int[25*25];
static int[][] arr;
static boolean[][] visited;
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, 1, 0, -1};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new int[n][n];
visited = new boolean[n][n];
for(int i=0; i<n; i++){
String str = br.readLine();
for(int j=0; j<n; j++){
arr[i][j] = str.charAt(j)-'0';
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(!visited[i][j] && arr[i][j]==1){
vnum++;
fn(i, j);
}
}
}
Arrays.sort(varr);
System.out.println(vnum);
for(int i=0; i<varr.length; i++){
if(varr[i] != 0)
System.out.println(varr[i]);
}
}
public static void fn(int x, int y){
Queue<int[]> q = new LinkedList<>();
q.add(new int[] {x, y});
visited[x][y] = true;
varr[vnum]++;
while(!q.isEmpty()){
int[] xy = q.poll();
for(int i=0; i<4; i++){
int nx = xy[0] + dx[i];
int ny = xy[1] + dy[i];
if(nx<0 || nx>=n || ny<0 || ny>=n || arr[nx][ny]!=1 || visited[nx][ny])
continue;
q.add(new int[] {nx, ny});
visited[nx][ny] = true;
varr[vnum]++;
}
}
}
}//dfs
import java.util.*;
import java.io.*;
public class Main{
static int n, vnum=0;
static int[] varr = new int[25*25];
static int[][] arr;
static boolean[][] visited;
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, 1, 0, -1};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new int[n][n];
visited = new boolean[n][n];
for(int i=0; i<n; i++){
String str = br.readLine();
for(int j=0; j<n; j++){
arr[i][j] = str.charAt(j)-'0';
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(!visited[i][j] && arr[i][j]==1){
vnum++;
fn(i, j);
}
}
}
Arrays.sort(varr);
System.out.println(vnum);
for(int i=0; i<varr.length; i++){
if(varr[i] != 0)
System.out.println(varr[i]);
}
}
public static void fn(int x, int y){
visited[x][y] = true;
varr[vnum]++;
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx<0 || nx>=n || ny<0 || ny>=n || visited[nx][ny] || arr[nx][ny] != 1)
continue;
fn(nx, ny);
}
}
}