관리 메뉴

Mini

백준 : 15686 치킨배달 본문

Algorithm/boj

백준 : 15686 치킨배달

Mini_96 2022. 8. 12. 14:02

https://www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

//comb(0,0)시작
//nCm임 (n==전체 치킨집수, m=선택된치킨집 수)
//1.n크기의 체크배열 생성
//2.for( i= 0~n-1)
// check[i]=true
// comb(i,cnt+1)
// check[i]=false;
//3.if(cnt==M) 할일(완성된조합, 체크되면->계산), 리턴

 

check배열 idx와 치킨리스트 idx는 맞추어져있음

할일 :

for(home h : homes)

for(int i=0~치킨사이즈)

if(check[i])

h[0]-chickens.get(i)[0] ............ //차이계산

static void comb(int idx, int cnt)
	{
		if(cnt==M)
		{
			calc();		//조합완성시 할일들
			return;
		}
		
		for(int i=idx+1;i<check.length;++i)
		{
			check[i]=true;
			comb(i,cnt+1);
			check[i]=false;
		}
	}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_15686_유동훈 {
	static int N;
	static int M;
	static int[][] map;
	static List<int[]> chickens;
	static List<int[]> homes;
	static int answer=Integer.MAX_VALUE;
	static boolean[] check;
	static int[] result;
	
	static List<int[]> union(List<int[]> list1, int[] is)
	{
		List<int[]> joined=new ArrayList<int[]>();
		joined.addAll(list1);	//joined  안쓰고 list1쓰기/???
		if(is[0]!=-1) joined.add(is);
		return joined;
		
	}
	static void calc()
	{
		int dist=0;
		
		 for (int[] h : homes) {
             int tmp = Integer.MAX_VALUE;
             for (int i = 0; i < chickens.size(); i++) {
                 if (check[i])
                     tmp = Math.min(tmp, Math.abs(h[0] - chickens.get(i)[0]) + Math.abs(h[1] - chickens.get(i)[1]));
             }
             dist += tmp;
         }
         answer = Math.min(answer, dist);
		//answer=result;
		//return result;

	}
	/*static void sol(List<int[]> m_chickens,int depth, int m, int not_select)
	{
		if(cnt>=1)
		{
			answer=Math.min(answer, calc(m_chickens));
		}
		if(m_chickens.size()==m)
		{
			//answer=Math.min(answer, calc(m_chickens));
			calc(m_chickens);
			return;
		}
		//가지치기
		//치킨집수-not_select수<선택해야되는 수 -> ~유망 -> 가지치기
		if(chickens.size()-not_select < m)
		{
			return;
		}
		if(depth==m && m>0)
		{
			return;
		}
		
		
		
		if(select==m)
		{
			answer=Math.min(answer, calc(m_chickens));
			return;
		}
		
		//for문 => 트리의 루트를 1,2,3,4.. 일때 각각 한번씩해줌
		//for문 없으면 루트가 1로 고정.
		for(int i=0; i<chickens.size();++i)
		{
			sol(union(m_chickens,chickens.get(i)),depth+1,m,not_select); 
			
			sol(union(m_chickens,new int[] {-1,-1}),depth+1,m,not_select+1); 
		}
		
		
	}*/
	
	//comb(0,0)시작
	//nCm임 (n==전체 치킨집수, m=선택된치킨집 수)
	//1.n크기의 체크배열 생성
	//2.for(0~n-1)
	//		check[i]=true
	//		comb(i,cnt+1)
	//		check[i]=false;
	//3.if(cnt==M) 할일, 리턴
	static void comb(int idx, int cnt)
	{
		if(cnt==M)
		{
			calc();		//조합완성시 할일들
			return;
		}
		
		for(int i=idx+1;i<check.length;++i)
		{
			check[i]=true;
			comb(i,cnt+1);
			check[i]=false;
		}
	}
	

	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //N = Integer.parseInt(br.readLine());
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        N=Integer.parseInt(st.nextToken());
        M=Integer.parseInt(st.nextToken());
        StringBuilder sb= new StringBuilder();
        
        map=new int[N][N];
        homes = new ArrayList<int[]>();
        chickens = new ArrayList<int[]>();
        for(int i=0;i<N;++i)
        {
        	st = new StringTokenizer(br.readLine());
        	for(int j=0;j<N;++j)
        	{
        		map[i][j]=Integer.parseInt(st.nextToken());
        		if(map[i][j]==1)
        		{
        			homes.add(new int[] {i,j});
        		}
        		else if(map[i][j]==2)
        		{
        			chickens.add(new int[] {i,j});
        		}
        	}
        }
        //입력 끝
        
        /*List<int[]> m_chickens=new ArrayList<int[]>();
        for(int i=1;i<=M;++i)
        {
        	 sol(m_chickens,0,i,0);
        }*/
        
        check= new boolean[chickens.size()];
        comb(-1,0);
        //comb2(0,0);
        
        sb.append(answer);
        System.out.println(sb);

	}

}

'Algorithm > boj' 카테고리의 다른 글

2839번: 설탕배달  (0) 2022.08.16
백준: 11047 동전 0  (0) 2022.08.12
11286번: 절대값 힙  (0) 2022.08.12
2961번 : 도영이가 만든 맛있는 음식  (0) 2022.08.11
3040번: 백설 공주와 일곱 난쟁이  (0) 2022.08.11