https://www.acmicpc.net/problem/1987
시작 지점 [0, 0] 에서부터 DFS 시작
DFS + Backtracking 으로 이동 가능한 최대 칸 수를 구함
=> 이동 가능한 최대 칸 수를 알아내기 위해서는, 가능한 모든 경로를 확인해야 함
boolean[]
: 알파벳 방문 확인check['B' - 'A']
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int r, c; // 입력 행, 열 개수
static char[][] board; // 알파벳이 적힌 row행 col열 보드
static int maxNum = 0; // 출력 값, 이동 가능한 최대 칸 수
static boolean[] check = new boolean[26]; // 알파벳 방문 확인 (A ~ Z 26개)
static int[] dy = { -1, 1, 0, 0 }; // 상하좌우
static int[] dx = { 0, 0, -1, 1 };
/* count: 이동한 칸의 수 (지나온 알파벳 개수) */
static void dfs(int row, int col, int count) {
// 현재 지점 기준, 상하좌우 확인
for (int i = 0; i < 4; i++) {
int nextRow = row + dy[i];
int nextCol = col + dx[i];
if (0 <= nextRow && nextRow < r &&
0 <= nextCol && nextCol < c) {
char nextAlpha = board[nextRow][nextCol]; // 다음 지점의 알파벳
if (!check[nextAlpha - 'A']) {
check[nextAlpha - 'A'] = true;
dfs(nextRow, nextCol, count + 1);
// 재귀 호출 복귀 시점: 방문 확인 배열 복구 => Backtracking
check[nextAlpha - 'A'] = false;
}
}
}
maxNum = Math.max(maxNum, count);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
StringTokenizer st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
board = new char[r][c];
for (int i = 0; i < r; i++) {
String str = br.readLine();
for (int j = 0; j < c; j++)
board[i][j] = str.charAt(j);
}
// [0, 0] 방문 처리하고 시작
char start = board[0][0];
check[start - 'A'] = true;
dfs(0, 0, 1);
System.out.println(maxNum);
}
}