티스토리 뷰

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

 

15686번: 치킨 배달

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

www.acmicpc.net

const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n").map(v=>v.split(' ').map(x=>+x));
const [N,M] = input.shift();
const home = [];
const chicken = [];
const chick_dist = [];
let answer = 2000000;


for(let i =0; i<N; i++){
  for(let j = 0; j<N; j++){
    if(input[i][j]==1){
      home.push({"hi":i,"hj":j})
      chick_dist.push([])
    }else if(input[i][j]==2){
      chicken.push({"ci":i,"cj":j})
    }
  }
}
const all_chick = chicken.length;

home.forEach((h,i)=>{
  const {hi,hj} = h;
  chicken.forEach((c,k)=>{
    const {ci,cj} = c;
    const dist = Math.abs(hi-ci)+Math.abs(hj-cj);
    chick_dist[i].push(dist)
  })
})


for(let k = 0; k<(1<<all_chick);k++){
  if(countBits(k)<=M){
    const combination = [];
    for(let l = 0; l<all_chick; l++){
      if(k&(1<<l)){
        combination.push(l);
      }
    }
      let sum = 0;
      chick_dist.forEach((v,i)=>{
        const tempdist = v;
        sum+=Math.min(...tempdist.filter((_,k)=>combination.includes(k)))
      })
      if(sum<answer) answer = sum
  }
}

console.log(answer)


function countBits(value){ 
  let count  = 0; 
  while(value>0){ 
    if((value&1)==1) count++; 
    value = value>>1; 
  }
  return count; 
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함