๐ŸŽฒ ๋ฐฑ์ค€ 18809๋ฒˆ

Jeongeunยท2024๋…„ 1์›” 27์ผ
0

๋ฐฑ์ค€

๋ชฉ๋ก ๋ณด๊ธฐ
157/187

๋ฐฑ์ค€ 18809๋ฒˆ

๐Ÿ’Š ์ •๋‹ต์„ ๋ด๋„ ๋กœ์ง์ด ๋˜‘๊ฐ™์€๋ฐ ๋Œ€์ฒด ์™œ ํ‹€๋ฆฌ์ง€ ์—„์ฒญ ๊ณ ๋ฏผํ–ˆ๋‹ค.. ์ •๋ง ๋ง‰๋ง‰ํ–ˆ๋Š”๋ฐ ๋‹คํ–‰ํžˆ ์ฐพ์•„๋ƒˆ๋‹ค ํ›„์šฐ..
if (visited[pointY][pointX][0] === "F") continue;
queue์— ๋“ค์–ด๊ฐ„ ๋ฐฐ์—ด ์ค‘ "F"๋กœ ๋ฐ”๋€ ์• ๋“ค์ด ์žˆ์„ํ…๋ฐ ์ด๊ฑธ ์ฒ˜๋ฆฌ๋ฅผ ์•ˆํ•ด์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค...

์ฝ”๋“œ

const fs = require('fs'); 
const input = fs.readFileSync('/dev/stdin').toString().trim().split("\n");
const [N, M, G, R] = input.shift().split(" ").map(Number);
const garden = input.map((el) => el.split(" ").map(Number));

let answer = 0;

const bfs = (green, red) => {
 const visited = Array.from(new Array(N), () =>
   Array.from(new Array(M), () => ["1", 0])
 );

 let flower = 0;
 const dir = [
   [0, 1],
   [0, -1],
   [1, 0],
   [-1, 0],
 ];
 const queue = [];

 for (let g of green) {
   const Y = Math.floor(g / M);
   const X = g % M;
   visited[Y][X][0] = "G";
   queue.push([Y, X, 0]);
 }

 for (let r of red) {
   const Y = Math.floor(r / M);
   const X = r % M;
   visited[Y][X][0] = "R";
   queue.push([Y, X, 0]);
 }

 while (queue.length) {
   const [pointY, pointX, time] = queue.shift();
   if (visited[pointY][pointX][0] === "F") continue;
   for (let d = 0; d < 4; d++) {
     const [nextY, nextX] = [pointY + dir[d][0], pointX + dir[d][1]];
     if (
       nextY < 0 ||
       nextX < 0 ||
       nextY >= N ||
       nextX >= M ||
       visited[nextY][nextX][0] === "F" ||
       garden[nextY][nextX] === 0
     )
       continue;

     if (visited[nextY][nextX][0] === "1") {
       visited[nextY][nextX] = [visited[pointY][pointX][0], time + 1];
       queue.push([nextY, nextX, time + 1]);
     } else if (
       (visited[nextY][nextX][0] === "G" &&
         visited[pointY][pointX][0] === "R") ||
       (visited[nextY][nextX][0] === "R" && visited[pointY][pointX][0] === "G")
     ) {
       if (visited[nextY][nextX][1] === time + 1) {
         visited[nextY][nextX] = ["F", time + 1];
         flower++;
       }
     }
   }
 }
 return flower;
};

const visited = new Array(N * M).fill(false);

const dfs = (index, green, red) => {
 if (green.length === G && red.length === R) {
   const flower = bfs(green, red);
   if (answer < flower) {
     answer = flower;
   }
   return;
 }

 for (let i = index; i < N * M; i++) {
   if (visited[i]) continue;
   const Y = Math.floor(i / M);
   const X = i % M;
   if (garden[Y][X] === 2) {
     visited[i] = true;
     green.push(i);
     dfs(i, green, red);
     green.pop();
     red.push(i);
     dfs(i, green, red);
     red.pop();
     visited[i] = false;
   }
 }
};

dfs(0, [], []);
console.log(answer);

0๊ฐœ์˜ ๋Œ“๊ธ€