본문 바로가기
Algorithm/백준

[백준] 실버2 꽃길

by sangyunpark 2023. 9. 18.

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