๐ ์ฒ์์ ์ฌ๋์ด ์ด๋ํ๊ณ ๋ถ์ด ๋ฒ์ง ์ ์์ผ๋๊น ํ์ ์ฌ๋ ์์น๋ฅผ ๋จผ์ ๋ฃ์ด์ผ ๋๋ค ์๊ฐํ๊ณ ํ์๋ค. ํ๋ค๊ฐ ์ด๋ผ ์ด๋ฌ๋ฉด ๋ถ์ด ๋ฒ์ง๋ ๊ณณ์ผ๋ก ๊ฐ ์๊ฐ ์๊ฒ ๋ค ํ๊ณ ์์ ํด์ฃผ์๋ค.
๐ ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐ์ ํ์ ๋ฃ์ด์ฃผ๋ ์์ ์ ํ ๋, if๋ฌธ์ธ ๋ถ์ด๋ผ๋ฉด~์ ์ฌ๋์ด๋ผ๋ฉด~๋ณด๋ค ๋จผ์ ํด์คฌ๋ค๊ณ ๋ถ ๋จผ์ ๋ค์ด๊ฐ๋ค๊ณ ์๊ฐํ๋คใ ใ ใ ใ ใ ๋ฐ๋ก๋ฅผ ํด๋ณด๋ค๊ฐ ๊นจ๋ฌ์๋ค.
๐ก ์ด๊ธฐ์ ํ์ ๋ฃ๋ ์์ ์์ ๋ถ์ด ๋จผ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ์๋ฉด ํ ์ ์๋ ๋ฌธ์ ๊ฐ๋ค. bfsํ์์์๋ ๋ถ์ผ ๊ฒฝ์ฐ์ ์ฌ๋์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ํ์ ํ๋๋๋ก ํด์ฃผ๋ฉด ๋๋ค.
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const N = +input.shift();
const dir = [
[0, 1],
[0, -1],
[-1, 0],
[1, 0],
];
let index = 0;
for (let n = 0; n < N; n++) {
const [w, h] = input[index].split(" ").map(Number);
let arr = [];
for (let i = 1; i <= h; i++) {
arr.push(input[index + i].split(""));
}
const queue = [];
let position;
for (let i = 0; i < h; i++) {
for (let j = 0; j < w; j++) {
if (arr[i][j] === "*") {
queue.push(["*", i, j, 0]);
}
if (arr[i][j] === "@") {
position = ["@", i, j, 0];
arr[i][j] = "x";
}
}
}
queue.push(position);
let impossible = true;
let flag = 0;
while (flag < queue.length) {
const [type, pY, pX, time] = queue[flag];
if (
type === "@" &&
(pX === 0 || pY === 0 || pX === w - 1 || pY === h - 1)
) {
console.log(time + 1);
impossible = false;
break;
}
for (let d = 0; d < 4; d++) {
const nY = pY + dir[d][0];
const nX = pX + dir[d][1];
if (nY >= 0 && nY < h && nX >= 0 && nX < w) {
if (type === "@") {
if (arr[nY][nX] === ".") {
queue.push(["@", nY, nX, time + 1]);
arr[nY][nX] = "x";
}
} else {
if (arr[nY][nX] !== "#" && arr[nY][nX] !== "*") {
queue.push(["*", nY, nX, time + 1]);
arr[nY][nX] = "*";
}
}
}
}
flag++;
}
if (impossible) console.log("IMPOSSIBLE");
index += h + 1;
}