[문제]
https://www.acmicpc.net/problem/14620
[풀이]
기본 백트래킹을 이용한 완전 탐색 문제.
[코드]
package 브루트포스;
import java.io.*;
import java.util.*;
public class boj_14620_꽃길 {
static int n;
static int[][] board;
static boolean[][] visited;
static int answer = Integer.MAX_VALUE;
static int[] dr = {0, 0, 1, -1};
static int[] dc = {1, -1, 0, 0};
public static void main(String[] args) throws Exception{
//진아가 꽃을 심기 위해 필요한 최소비용을 구해주자!
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
StringTokenizer st;
board = new int[n][n];
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<n; j++){
board[i][j] = Integer.parseInt(st.nextToken());
}
}
visited = new boolean[n][n];
dfs(0, 0);
System.out.println(answer);
}
public static void dfs(int depth, int cost){
if(depth==3){
//꽃을 3가 다 선택했으면 최소 비용 갱신
answer = Math.min(answer, cost);
return;
}
for(int i=1; i<n-1; i++){
for(int j=1; j<n-1; j++){
//현재 위치+상하좌우에 꽃잎이 있으면 안됨
if(visited[i][j]) continue;
boolean flag = true;
for(int d=0; d<4; d++){
int nr = i + dr[d];
int nc = j + dc[d];
if(visited[nr][nc]) {
flag = false;
break;
}
}
if(!flag) continue;
//방문 처리
int sum = board[i][j];
visited[i][j] = true;
for(int d=0; d<4; d++){
int nr = i + dr[d];
int nc = j + dc[d];
sum += board[nr][nc];
visited[nr][nc] = true;
}
dfs(depth+1, cost+sum);
//배열 원상태로
visited[i][j] = false;
for(int d=0; d<4; d++){
int nr = i + dr[d];
int nc = j + dc[d];
visited[nr][nc] = false;
}
}
}
}
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[boj] 백준 14501 퇴사 (Java) - 완전탐색 (0) | 2023.04.28 |
---|---|
[boj] 백준 2503 숫자 야구 (Java) - 완전 탐색 (0) | 2023.04.28 |
[boj] 백준 gold5 13164 행복 유치원 (Java) - 그리디 (0) | 2023.04.15 |
[boj] 백준 gold5 11000 강의실 배정 (Java) - 그리디 (0) | 2023.04.15 |
[boj] 백준 silver1 1931 회의실 배정 (Java) - 그리디 (1) | 2023.04.15 |