โจ BFS + DFS + ์์ ํ์
๐๊ณ ๋ คํด์ผํ ์
- ๋ฒฝ์ 3๊ฐ ์ธ์ด๋ค. โ ์ผ์ผ์ด 3๊ฐ์ ๋ฒฝ์ ์ธ์๋ณธ ํ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ ค ์์ ์์ญ์ด ์ต๋์ธ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ค. (๋ฐฑํธ๋ํน + ์์ ํ์)
- ๋ฒฝ์ 3๊ฐ ์ธ์ด ํ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ ๊ฒฝ์ฐ๋ ๋ค์ํ๋ฏ๋ก ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ ๊ตฌํ๋ค.
๐น๏ธ ํ์ด๊ณผ์
1๏ธโฃ ๋ฐ์ด๋ฌ์ค์ ๋ฒฝ์ด ์๋ ๊ณณ์ ์ ๋ณด๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
2๏ธโฃ ๋ฒฝ์ ์ธ์ด๋ค. โ 3๊ฐ์ ๋ฒฝ์ ์ธ์์ผ ํ๋ฏ๋ก ์กฐํฉ์ ์๊ฐํ๋ฉด ๋๋ค. DFS์ ๋ฐฑํธ๋ํน์ ์ด์ฉํด ๋ฒฝ์ ์ธ์ฐ๋ฉด ๋๋ค.
3๏ธโฃ 3๊ฐ์ ๋ฒฝ์ด ์ธ์์ง๋ฉด ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฐ๋ค. ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ๊ณณ๋ถํฐ ์์ํด ํผ์ง๋ฏ๋ก ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ๊ณณ์ ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํด์ผ ํ๋ค.
4๏ธโฃ 3๊ฐ์ ๋ฒฝ์ด ์ธ์์ง๋ ๊ฒฝ์ฐ๋ ๋งค๋ฒ ๋ฌ๋ผ์ง๋ฏ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ๋ณต์ฌํด์ ์ฌ์ฉํ๋ค.
5๏ธโฃ ๋ฐ์ด๋ฌ์ค๊ฐ ๋ค ํผ์ก์ผ๋ฉด ์์ ์์ญ์ ๊ตฌํ๋ค.
๐ฉ๐ป ์ ์ฒด ์ฝ๋
public class BOJ_14502_์ฐ๊ตฌ์ {
static int N, M;
static int max = Integer.MIN_VALUE;
static int[][] lab;
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
static class Info{
int x, y;
public Info(int x, int y) {
this.x = x;
this.y = y;
}
}
//DFS
static void makeWall(int depth){
if (depth == 3) {
spreadVirus();
return;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (lab[i][j] ==0) {
lab[i][j]=1;
makeWall(depth + 1);
lab[i][j]=0;
}
}
}
}
// BFS
static void spreadVirus(){
Queue<Info> queue = new LinkedList<>();
int[][] virusMap = new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
virusMap[i][j] = lab[i][j];
if (virusMap[i][j] == 2) {
queue.add(new Info(i, j));
}
}
}
while (!queue.isEmpty()) {
Info now = queue.poll();
for (int i = 0; i < 4; i++) {
int nx = now.x + dx[i];
int ny = now.y + dy[i];
if (nx >= 0 && ny >= 0 && nx < N && ny < M && virusMap[nx][ny]==0) {
virusMap[nx][ny] = 2;
queue.add(new Info(nx, ny));
}
}
}
int cnt=0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (virusMap[i][j] == 0) {
cnt++;
}
}
}
max = Math.max(cnt, max);
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
lab = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
lab[i][j] = Integer.parseInt(st.nextToken());
}
}
makeWall(0);
bw.write(max + " ");
bw.flush();
bw.close();
}
}
'์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 18352 ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ - Java (0) | 2023.12.04 |
---|---|
[BOJ] 4179 ๋ถ! - Java (1) | 2023.10.25 |
[BOJ] 3190 ๋ฑ (0) | 2023.09.25 |
[BOJ] 11657 ํ์๋จธ์ (1) | 2023.09.08 |
[BOJ] 1865 ์ํ (0) | 2023.09.08 |