- void backtracking(int n, int m, int sum, int start);
1. 모든 좌표 탐색을 위해 n과 m을 파라미터로 넘겨주며, 누적된 합산을 관리하는 sum 파라미터와
다음 좌표로의 이동을 위해 start 파라미터도 만들었다
- backtracking(n,m,sum+tmp, i+1)
1. 3개의 좌표의 합산을 인수로 넘겨주며, 다음 탐색값을 i+1로 넘겨준다
- 없음
1. 놀랍게도 base condition은 존재하지 않는다.
왜냐하면, 다음 조건을 만족하지 못하면 아예 재귀식을 실행하지 않도록 설계했기 때문이다
2. 인덱스 범위를 벗어나거나 나무 재료의 주어진 모양에서의 3개 영역을 하나라도 방문했다면
재귀식을 실행하지 않는다
3. 따라서 n x m만큼의 순회가 일어나면 재귀식이 알아서 종료되어서
따로 base condition을 만들어줄 필요가 없다
import java.io.*;
import java.util.*;
public class Main {
static int[][] arr;
static List<Integer> lists = new ArrayList<>();
static boolean[][] visited;
static int[] dy = {1, -1, -1, 1};
static int[] dx = {-1, -1, 1, 1};
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());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
arr = new int[n][m];
visited = new boolean[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
backtracking(n,m,0, 0);
lists.sort(Collections.reverseOrder());
bw.write(lists.get(0)+"");
br.close();
bw.close();
}
private static void backtracking(int n, int m, int sum, int start) {
lists.add(sum);
for (int i = start; i < n * m; i++) {
int r = i / m;
int c = i % m;
for (int j = 0; j < 4; j++) {
int tmp = 0;
int ny = dy[j] + r;
int nx = dx[j] + c;
if(ny >= 0 && nx >= 0 && ny < n && nx < m && !visited[r][c] && !visited[ny][c] && !visited[r][nx]){
tmp += arr[r][c]*2;
tmp += arr[ny][c];
tmp += arr[r][nx];
visited[r][c] = true;
visited[ny][c] = true;
visited[r][nx] = true;
backtracking(n,m,sum + tmp, i+1);
visited[ny][c] = false;
visited[r][nx] = false;
visited[r][c] = false;
}
}
}
}
}