-
1987 : 알파벳Solve Algorithms/BFS, DFS 2020. 5. 3. 18:59728x90
출처 : https://www.acmicpc.net/problem/1987
문제
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
입력
첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1 ≤ R,C ≤ 20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.
출력
첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.
접근
- 모든 정점에 대해 체크를 진행하는 BFS 알고리즘보다는, 하나의 정점에 대해 끝까지 탐색하는 DFS 알고리즘을 이용하였다.
- visit 배열의 크기를 26으로 하여, 알파벳의 방문 여부를 체크한다.
- 탐색 후, 더이상 탐색할 수 없을 때, 백트래킹이 일어나는 정점을 방문하지 않음(false)으로 해주어야 한다.
- 백트래킹에 관한 문제를 더 풀어볼 필요가 있을 것 같다.
코드
public class Main {static int R, C, MAX = 0;static char[][] map;static boolean[] visit;static int[] dx = { -1, 0, 1, 0 };static int[] dy = { 0, -1, 0, 1 };public static void DFS(int X, int Y, int depth) {visit[map[X][Y] - 'A'] = true;for (int i = 0; i < 4; i++) {int nextX = X + dx[i];int nextY = Y + dy[i];if (nextX >= 0 && nextY >= 0 && nextX < R && nextY < C) {if (visit[map[nextX][nextY] - 'A'] == false) {DFS(nextX, nextY, depth + 1);}}}visit[map[X][Y] - 'A'] = false;MAX = Math.max(MAX, depth);}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));StringTokenizer st = new StringTokenizer(br.readLine(), " ");R = Integer.parseInt(st.nextToken());C = Integer.parseInt(st.nextToken());map = new char[R][C];visit = new boolean[26];for (int i = 0; i < R; i++) {char[] c=br.readLine().toCharArray();for (int j = 0; j < C; j++) {map[i][j] = c[j];}}int depth = 1;DFS(0, 0, 1);}}728x90'Solve Algorithms > BFS, DFS' 카테고리의 다른 글
5014 : 스타트링크 (0) 2020.05.03 6593 : 상범 빌딩 (0) 2020.05.03 2589 : 보물섬 (0) 2020.04.28 2573 : 빙산 (0) 2020.04.28 3187 : 양치기꿍 (0) 2020.04.24