(1~2회차 시도 실패)
import java.io.*;
import java.util.*;
public class Main {
static int[][] arr;
static boolean[][] visited;
static int m;
static int k;
static int[] dy = {0,0,-1,1};
static int[] dx = {-1,1,0,0};
static boolean isOk = true;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int[n][n];
visited = new boolean[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
if (m == 0) {
bw.write("IMPOSSIBLE");
}else{
int chk = m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(arr[i][j] == 0 && !visited[i][j]){
if(m == 0){
isOk = false;
break;
}
bfs(n, i, j);
}
if(!isOk){
break;
}
}
if(!isOk){
break;
}
}
if(chk == m){
isOk = false;
}
if(!isOk){
bw.write("IMPOSSIBLE");
}else{
bw.write("POSSIBLE\n");
bw.write(m+"");
}
}
br.close();
bw.close();
}
private static void bfs(int n, int y, int x) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[] {y,x});
visited[y][x] = true;
int count = 0;
while(!q.isEmpty()){
int[] tmp = q.poll();
count++;
for (int i = 0; i < 4; i++) {
int ny = tmp[0] + dy[i];
int nx = tmp[1] + dx[i];
if(ny >= 0 && nx >=0 && ny < n && nx < n && !visited[ny][nx] && arr[ny][nx] == 0){
q.add(new int[]{ny,nx});
visited[ny][nx] = true;
}
}
}
if(count > m * k){
isOk = false;
return;
}
m -= (count / k);
m -= (count % k > 0 ? 1 : 0);
}
}
(3회차 시도 성공)
import java.io.*;
import java.util.*;
public class Main {
static int[][] arr;
static boolean[][] visited;
static int m;
static int k;
static int[] dy = {0,0,-1,1};
static int[] dx = {-1,1,0,0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int[n][n];
visited = new boolean[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
if (m == 0) {
bw.write("IMPOSSIBLE");
}else{
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(arr[i][j] == 0 && !visited[i][j]){
ans += bfs(n, i, j);
}
}
}
if(ans > m || ans == 0 ){
bw.write("IMPOSSIBLE");
}else{
bw.write("POSSIBLE\n");
bw.write((m-ans)+"");
}
}
br.close();
bw.close();
}
private static int bfs(int n, int y, int x) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[] {y,x});
visited[y][x] = true;
int count = 0;
while(!q.isEmpty()){
int[] tmp = q.poll();
count++;
for (int i = 0; i < 4; i++) {
int ny = tmp[0] + dy[i];
int nx = tmp[1] + dx[i];
if(ny >= 0 && nx >=0 && ny < n && nx < n && !visited[ny][nx] && arr[ny][nx] == 0){
q.add(new int[]{ny,nx});
visited[ny][nx] = true;
}
}
}
int res = count / k;
res += (count % k > 0 ? 1 : 0);
return res;
}
}