메모리: 15136 KB, 시간: 860 ms
백트래킹, 깊이 우선 탐색, 그래프 이론, 그래프 탐색
2024년 12월 22일 21:15:57
세로 칸, 가로 칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (행 열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
첫째 줄에
과 가 빈칸을 사이에 두고 주어진다. () 둘째 줄부터 개의 줄에 걸쳐서 보드에 적혀 있는 개의 대문자 알파벳들이 빈칸 없이 주어진다.
첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.
/**
* Author: yngbao97, Yuk Yejin
* Problem: 알파벳_1987
* Date: 2024.12.22
*/
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
static int n;
static int m;
static int[][] board;
static boolean[] visited;
static int max;
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] input = br.readLine().split(" ");
n = Integer.parseInt(input[0]);
m = Integer.parseInt(input[1]);
board = new int[n][m];
for (int i = 0; i < n; i++) {
char[] line = br.readLine().toCharArray();
for (int j = 0; j < m; j++) {
board[i][j] = line[j] - 'A';
}
}
visited = new boolean[26];
visited[board[0][0]] = true;
max = 0;
dfs(0, 0, 1);
bw.write(String.valueOf(max));
bw.flush();
bw.close();
br.close();
}
public static void dfs(int row, int col, int cnt) {
for (int i = 0; i < 4; i++) {
int nr = row + dr[i];
int nc = col + dc[i];
if (nr >= n || nr < 0 || nc >= m || nc < 0 || visited[board[nr][nc]]) continue;
visited[board[nr][nc]] = true;
dfs(nr, nc, cnt + 1);
visited[board[nr][nc]] = false;
}
max = Math.max(max, cnt);
}
}