Algorithm/백준
[골드4] 알파벳
sangyunpark
2023. 9. 5. 14:46
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
전형적인 완전탐색 문제이다..!
원상복구 처리가 핵심!
알파벳이 사용되므로, 아스키 코드를 활용해서 방문 처리를 해준다.
2번경로로 가기 위해서는 원상복구를 해주어야 한다.
풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int R;
public static int C;
public static String[][]map;
// 북동서남
public static int[] dx = new int[]{0,1,0,-1};
public static int[] dy = new int[]{-1,0,1,0};
public static int[] visited;
public static char a = 'A';
public static int answer = Integer.MIN_VALUE;
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());
map = new String[R][C];
visited = new int[26]; // 아스키 코드를 활용한 알파벳
for (int i = 0; i < R; i++) {
st = new StringTokenizer(br.readLine());
map[i] = st.nextToken().split("");
}
visited[map[0][0].charAt(0) - a] = 1;
dfs(0,0,1);
System.out.println(answer);
}
public static void dfs(int y, int x, int cnt){
answer = Math.max(answer,cnt);
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue;
int next = map[ny][nx].charAt(0) - a;
if(visited[next] == 0){ // 방문하지 않은 경우
visited[next] = 1;
dfs(ny, nx, cnt+1);
visited[next] = 0; // 지나왔던 곳 방문처리 취소
}
}
}
}