[백준] 23352: 방탈출 - JAVA
https://www.acmicpc.net/problem/23352
풀이
상하좌우로 움직일 수 있는데 가장 긴 경로의 시작과 끝의 합을 구해야 한다.
N x M 배열을 입력받고, 0이 아니면 bfs탐색을 한다.
bfs탐색할 때 경로의 시작값을 함께 파라미터로 넘겨 진행했다.
더이상 갈 곳이 없을 때 지금까지의 최장 길이와 비교하여 답을 갱신해주었다.
메모리: 268784KB
시간: 568ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
static class Node {
int r;
int c;
int dist;
public Node(int r, int c, int dist) {
this.r = r;
this.c = c;
this.dist = dist;
}
}
static int[][] vector = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
static int N, M, ans, len;
static int[][] board;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
board = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
ans = 0;
len = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] != 0) {
bfs(i, j, board[i][j]);
}
}
}
System.out.println(ans);
}
private static void bfs(int r, int c, int start) {
Queue<Node> queue = new LinkedList<>();
queue.add(new Node(r, c, 0));
boolean[][] visit = new boolean[N][M];
visit[r][c] = true;
while (!queue.isEmpty()) {
Node node = queue.poll();
boolean flag = false;
for (int i = 0; i < 4; i++) {
int nr = node.r + vector[i][0];
int nc = node.c + vector[i][1];
if (nr < 0 || nc < 0 || nr >= N || nc >= M || visit[nr][nc]) {
continue;
}
if (board[nr][nc] != 0) {
flag = true;
visit[nr][nc] = true;
queue.add(new Node(nr, nc, node.dist + 1));
}
}
if (!flag && node.dist >= len) {
if (node.dist > len) {
ans = start + board[node.r][node.c];
} else {
ans = Math.max(ans, start + board[node.r][node.c]);
}
len = node.dist;
}
}
}
}