Study/Problem Solving
[BOJ_18430] 무기 공학
monitor
2023. 10. 15. 18:08
설명
처음에는 idx를 x 위치로 고정하고 for문으로 y 위치를 옮기면서 실행하였는데 이러면 마지막 행에서의 값을 제대로 처리하지 못하는 이슈가 있었다.
2 5
100 1 1 1 1
1 1 100 1 100
의 출력 값이 404가 나왔는데 실제로는 606이 정답이다.
그래서, x,y 값을 모두 돌 수 있는 방식으로 변경하게 되었다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int N,M,ans;
static boolean[][] visited;
static int arr[][];
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(in.readLine()," ");
N = Integer.parseInt(tk.nextToken());
M = Integer.parseInt(tk.nextToken());
arr = new int[N][M];
visited = new boolean[N][M];
ans = 0;
for(int i = 0; i < N; i++){
tk = new StringTokenizer(in.readLine()," ");
for(int j = 0; j < M; j++){
arr[i][j] = Integer.parseInt(tk.nextToken());
}
}
go(0,0);
System.out.println(ans);
}
private static void go(int idx,int sum) {
if(idx == N*M){
ans = Math.max(sum, ans);
return;
}
int x = idx / M;
int y = idx % M;
if(x + 1 < N && y - 1 >= 0){
if(!visited[x][y] && !visited[x][y - 1] && !visited[x + 1][y]) {
visited[x][y] = true;
visited[x][y - 1] = true;
visited[x + 1][y] = true;
go(idx + 1, sum + arr[x][y] * 2 + arr[x + 1][y] + arr[x][y - 1]);
visited[x][y] = false;
visited[x][y - 1] = false;
visited[x + 1][y] = false;
}
}
if (x - 1 >= 0 && y - 1 >= 0) {
if(!visited[x][y] && !visited[x][y - 1] && !visited[x - 1][y]) {
visited[x][y] = true;
visited[x][y - 1] = true;
visited[x - 1][y] = true;
go(idx + 1, sum + arr[x][y] * 2 + arr[x - 1][y] + arr[x][y - 1]);
visited[x][y] = false;
visited[x][y - 1] = false;
visited[x - 1][y] = false;
}
}
if (x - 1 >= 0 && y + 1 < M) {
if(!visited[x][y] && !visited[x][y + 1] && !visited[x - 1][y]) {
visited[x][y] = true;
visited[x][y + 1] = true;
visited[x - 1][y] = true;
go(idx + 1, sum + arr[x][y] * 2 + arr[x][y + 1] + arr[x - 1][y]);
visited[x][y] = false;
visited[x][y + 1] = false;
visited[x - 1][y] = false;
}
}
if (x + 1 < N && y + 1 < M) {
if(!visited[x][y] && !visited[x][y + 1] && !visited[x + 1][y]) {
visited[x][y] = true;
visited[x][y + 1] = true;
visited[x + 1][y] = true;
go(idx + 1, sum + arr[x][y] * 2 + arr[x + 1][y] + arr[x][y + 1]);
visited[x][y] = false;
visited[x][y + 1] = false;
visited[x + 1][y] = false;
}
}
go(idx+1,sum);
}
}