2210번: 숫자판 점프
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, 212121 이 가능한 경우들이다.
www.acmicpc.net
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class Main {
static Set<String> s = new HashSet<>(); // 만들 수 있는 수들을 저장할 set
static String[][] arr = new String[5][5]; // 5*5 숫자판
static int[] dr = {-1, 0, 1, 0}; // 상, 우, 하, 좌
static int[] dc = {0, 1, 0, -1}; // 상, 우, 하, 좌
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// 5 * 5 숫자판 입력
for (int i = 0; i < 5; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 5; j++) {
arr[i][j] = st.nextToken();
}
}
// 각 칸마다 dfs
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
dfs(i, j, 0, arr[i][j]);
}
}
// 만들 수 있는 수들의 개수 출력
System.out.println(s.size());
}
static void dfs(int r, int c, int cnt, String num) {
// 다섯 번 이동 다한 경우(기저 조건)
if (cnt == 5) {
if (!s.contains(num)) {
s.add(num);
}
return;
}
// 인접해 있는 네 방향 탐색
for (int d = 0; d < 4; d++) {
int nr = r + dr[d];
int nc = c + dc[d];
// 숫자판 범위 바깥인 경우 skip
if (nr < 0 || nr >= 5 || nc < 0 || nc >= 5) {
continue;
}
dfs(nr, nc, cnt + 1, num + arr[nr][nc]);
}
}
}
728x90
'알고리즘 > DFS' 카테고리의 다른 글
[백준][JAVA] 10451번 순열 사이클 (1) | 2024.03.16 |
---|---|
[백준][JAVA] 2250번 트리의 높이와 너비 (0) | 2024.03.03 |
[백준][JAVA] 1303번 전쟁 - 전투 (1) | 2024.02.09 |
[백준][JAVA] 2251번 물통 (0) | 2024.02.08 |
[백준][JAVA] 3184번 양 (2) | 2024.01.29 |