티스토리 뷰

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

 

18290번: NM과 K (1)

크기가 N×M인 격자판의 각 칸에 정수가 하나씩 들어있다. 이 격자판에서 칸 K개를 선택할 것이고, 선택한 칸에 들어있는 수를 모두 더한 값의 최댓값을 구하려고 한다. 단, 선택한 두 칸이 인접

www.acmicpc.net

const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n").map(v=>v.split(' ').map(Number));
const [N,M,K] = input[0]
let board = input.splice(1)

let answer ;

for(let i = 0; i<N; i++){
  for(let j = 0; j<M; j++){
    board[i][j]  ={
      row:i,
      column:j,
      value:board[i][j],
    }
  }
}


function sequence(arr){
  const L = arr.length
  if(L==K){
    const sum = arr.map(v=>v.value).reduce((r,v)=>{return r+v},0)
    if(answer==null) answer = sum;
    if(sum>answer)answer = sum;
    return;
  }else{
    let n =0;
    let m = 0;
    if(L>0){
      const last = arr[L-1];
      n =  last.row;
      m = last.column;
    }
    
    for(let i = n; i<N; i++){
      for(let j = m;j<M; j++){
        if(check(arr,board[i][j])){
          arr.push(board[i][j]);
          sequence(arr)
          arr.pop()
        }
      }
      m=0;
    }

  }
  return
}

function check(arr,next){
  const {row,column} = next;
  for(let i = 0; i<arr.length; i++){
      if(row==arr[i].row && column ==arr[i].column ) return false;
      if(row==arr[i].row && column ==arr[i].column-1 ) return false;
      if(row==arr[i].row && column ==arr[i].column+1 ) return false;
      if(row==arr[i].row+1 && column ==arr[i].column ) return false;
      if(row==arr[i].row-1 && column ==arr[i].column ) return false;
  }
  return true;
}


sequence([],0);


console.log(answer)
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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 29 30
글 보관함