https://www.acmicpc.net/problem/14620
14620번: 꽃길
2017년 4월 5일 식목일을 맞이한 진아는 나무를 심는 대신 하이테크관 앞 화단에 꽃을 심어 등교할 때 마다 꽃길을 걷고 싶었다. 진아가 가진 꽃의 씨앗은 꽃을 심고나면 정확히 1년후에 꽃이 피므
www.acmicpc.net
3개의 꽃을 심는 것
어디에 어떻게 심는지 알아? 일단 다때려박기 완전탐색 생각
시간복잡도를 계산해보니 천만이 안넘는다. OKAY
완탐
방문처리 -> 재귀 -> 방문취소 처리
(1) 꽃이 현재 위치에 놓일 수 있는지 확인하는 함수
(2) 꽃을 놓는 함수
(3) 꽃을 제거하는 함수
3개 함수를 전부 사용하는 dfs 완전탐색 재귀함수
package 큰돌의터전알고리즘강의.three주차.꽃길;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static int n;
public static int[][] map;
public static int[][] visited;
public static int[] dy = new int[]{-1,0,1,0};
public static int[] dx = new int[]{0,1,0,-1};
public static int answer = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
map = new int[n][n];
visited = new int[n][n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
dfs(0,0);
System.out.println(answer);
}
public static int setFlower(int y, int x){
int sum = map[y][x];
visited[y][x] = 1; // 꽃 가운데
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
sum+=map[ny][nx];
visited[ny][nx] = 1; // 주변 꽃 잎 visited 처리
}
return sum;
}
public static void removeFlower(int y, int x){ // 방문처리 취소
visited[y][x] = 0;
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
visited[ny][nx] = 0;
}
}
public static void dfs(int sum, int cnt){
if(cnt == 3){ // 종료 조건
answer = Math.min(answer,sum);
return;
}
// 다음 지점 검색
for (int i = 0; i < n; i++) {
for (int j = 0; j <n ; j++) {
if(check(i,j)){
dfs(sum+setFlower(i,j),cnt+1);
removeFlower(i,j); // 꽃이 있던 자리 초기화
}
}
}
}
public static boolean check(int y, int x){ // 꽃이 들어설 수 있는 자리인지 확인하방
if(visited[y][x] != 0) return false;
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if(ny < 0 || nx < 0 || ny >=n || nx >=n || visited[ny][nx] != 0){
return false;
}
}
return true;
}
}
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1931번 - 회의실 배정 (0) | 2023.09.28 |
---|---|
[백준] 실버1 컴백홈 (0) | 2023.09.18 |
[백준] 골드3 15684 (0) | 2023.09.12 |
[실버 1] 완전 이진 트리 (0) | 2023.09.08 |
[실버1] 2529 (0) | 2023.09.07 |