connecting the dots

[BOJ/Java] 15686 : 치킨 배달 본문

algorithm/BOJ

[BOJ/Java] 15686 : 치킨 배달

林 : 2021. 2. 19. 18:30

문제

 

 

 

풀이

 

  • 설계

어제 풀었던 최적경로 문제와 비슷해서인지 특별한 문제 없이 풀 수 있었다 / 사실 bfs 써서 가까운 치킨집을 찾으려다가 어차피 폐업시키지 않을 치킨집 최대 개수가 13이라 모두 비교했다

 

 

 

코드

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main { // 치킨 배달
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int[][] map;
	static int N, M;
	static ArrayList<Node> home = new ArrayList<>();
	static ArrayList<Node> chicken = new ArrayList<>();
	static int[] combArr;
	static int ans = Integer.MAX_VALUE;

	public static void main(String[] args) throws Exception {
		st = new StringTokenizer(in.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		map = new int[N + 1][N + 1];
		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(in.readLine());
			for (int j = 1; j <= N; j++) {
				char temp = st.nextToken().charAt(0);
				if (temp == '1') {
					home.add(new Node(i, j));
				} else if (temp == '2') {
					chicken.add(new Node(i, j));
				}
			}
		}
		combArr = new int[M];
		combination(0, 0);
		System.out.println(ans);
	}

	private static void combination(int cnt, int start) {
		if (cnt == M) {
			ans = Math.min(ans, calculation(combArr));
			return;
		}
		for (int i = start; i < chicken.size(); i++) {
			combArr[cnt] = i;
			combination(cnt + 1, i + 1);
		}

	}

	private static int calculation(int[] combArr) {
		int sum = 0;
		for (Node h : home) {
			int dist = Integer.MAX_VALUE;
			for (int index : combArr) {
				dist = Math.min(dist, Math.abs(h.x - chicken.get(index).x) + Math.abs(h.y - chicken.get(index).y));
			}
			sum += dist;
		}
		return sum;
	}

	static class Node {
		int x, y;

		Node(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}
}

 

 

'algorithm > BOJ' 카테고리의 다른 글

[BOJ/Java] 2573 : 빙산  (0) 2021.02.20
[BOJ/Java] 2502 : 떡 먹는 호랑이  (0) 2021.02.20
[BOJ/Java] 3190 : 뱀  (0) 2021.02.19
[BOJ/Java] 17135 : 캐슬 디펜스  (0) 2021.02.17
[BOJ/Java] 16236 : 아기 상어  (0) 2021.02.17