BF로 시도했으나 후반부 case에서 fail 되었다.
디버깅이 쉽지 않아, 코드를 검색해 보니 dfs로 충분히 풀 수 있는 문제였다.
문제를 해결하기 위한 아이디어에는 차이가 없었으나, 구현에서 dfs를 적용하는 방식에 있어 아직도 부족함을 느꼈다.
특히나 dfs의 인자로 prevD를 넘겨주고, 이를 for문 idx의 초기값으로 사용하여 다음 순서를 진행하는 코드는 멋졌다.
(Combination 구할 때도 이와 같은 방식을 사용)
참조 사이트 : https://namhandong.tistory.com/215
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class Solution {
static int N;
static int[][] map;
private static boolean DBG = true;
static int[] dx = { 1/* 오른쪽 아래 */, 1/* 왼쪽 아래 */, -1/* 왼쪽 위 */, -1/* 오른쪽 위 */ };
static int[] dy = { 1, -1, -1, 1, };
static boolean[][] visited;
static boolean[] dessert;
static int max;
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T;
T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int test_case = 1; test_case <= T; test_case++) {
max=0;
N = Integer.parseInt(br.readLine());
map = new int[N][N];
StringTokenizer st = null;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N - 2; i++) {
for (int j = 1; j < N - 1; j++) {
visited = new boolean[N][N];
dessert = new boolean[101];
visited[i][j] = true;
dessert[map[i][j]] = true;
dfs(1, i, j, i, j, 0);
}
}
if (max == 0)
max = -1;
System.out.println("#" + test_case + " " + max);
}
System.out.println(sb);
}
private static void dfs(int cnt, int r, int c, int initR, int initC, int prevD) {
for (int i = prevD; i < 4; i++) {
int nr = r + dx[i];
int nc = c + dy[i];
if (nr >= 0 && nr < N && nc >= 0 && nc < N) {
if ((nr == initR) && (nc == initC) && cnt > 2) {
max = Math.max(max, cnt);
return;
}
if (!visited[nr][nc] && !dessert[map[nr][nc]]) {
visited[nr][nc] = true;
dessert[map[nr][nc]] = true;
dfs(cnt + 1, nr, nc, initR, initC, i);
visited[nr][nc] = false;
dessert[map[nr][nc]] = false;
}
}
}
}
}