카테고리 없음
30106_현이의 로봇 청소기
베리영young
2024. 6. 10. 14:40
사용 알고리즘: bfs
사용 언어: java
package src.alStudy02;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
/**
* 영역 나누기
*/
public class Main_bj_30106_현이의로봇청소기 {
static int n, m, k;
static int[][] map;
static int[][] visited;
static int[] dx = {1,-1,0,0};
static int[] dy = {0,0,1,-1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); //세로 길이
m = Integer.parseInt(st.nextToken()); //가로 길이
k = Integer.parseInt(st.nextToken()); //극복 가능 차이...
visited = new int[n][m];
map = new int[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
//입력 끝
int operations = 0; //작동 횟수
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (visited[i][j] == 0) { //방문하지 않았으면
operations++;
bfs_30106(i, j, operations); //좌표 + 방문 처리(작동 횟수로 처리)`
}
}
}
System.out.println(operations);
}
private static void bfs_30106(int x, int y, int operations) {
Queue<Point> q = new ArrayDeque();
q.offer(new Point(x, y));
visited[x][y] = operations; //방문 처리
while (!q.isEmpty()) {
Point p = q.poll();
int curHeight = map[p.x][p.y];
for (int d = 0; d < 4; d++) {
int nx = p.x + dx[d];
int ny = p.y + dy[d];
if (nx>=0 && nx<n && ny>=0 && ny<m && visited[nx][ny] == 0
&& Math.abs(curHeight-map[nx][ny]) <= k) {
visited[nx][ny] = operations;
q.offer(new Point(nx, ny));
}
}
}
//
}
}
플러드 필..? 모르겠고
영역나누기 문제여서 bfs로 풀어봤다