티스토리 뷰

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

 

5427번: 불

상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에

www.acmicpc.net

const fs = require('fs');
const input = fs.readFileSync('./dev/stdin').toString().trim().split('\n');

// '.': 빈 공간
// '#': 벽
// '@': 상근이의 시작 위치
// '*': 불

const T = +input.shift();

const dx = [0, 0, -1, 1];
const dy = [1, -1, 0, 0];

const answer = [];
for (let i = 0; i < T; i++) {
	const [M, N] = input.shift().split(' ').map(Number);
	let board = input.splice(0, N).map((v) => v.split(''));
	const result = sol(M, N, board);
	answer.push(result);
}

console.log(answer.join('\n'));

function sol(M, N, board) {
	let fullTime = [];
	let fire = [];
	let time = 1;
	let visited = Array.from(Array(N), () => Array(M).fill(false));
	for (let i = 0; i < N; i++) {
		for (let j = 0; j < M; j++) {
			if (board[i][j] == '@') {
				fullTime.push([i, j]);
				board[i][j] = '.';
				visited[i][j] = true;
			} else if (board[i][j] == '*') {
				fire.push([i, j]);
			}
		}
	}

	while (fullTime.length > 0) {
		// 상근이 이동하기
		const newFullTime = [];
		while (fullTime.length > 0) {
			const [x, y] = fullTime.pop();
			if (board[x][y] == '*') continue;
			for (let l = 0; l < 4; l++) {
				const nx = x + dx[l];
				const ny = y + dy[l];
				if (nx < 0 || nx >= N || ny < 0 || ny >= M) {
					return time;
				}

				if (board[nx][ny] == '.' && !visited[nx][ny]) {
					visited[nx][ny] = true;
					newFullTime.push([nx, ny]);
				}
			}
		}
		fullTime = newFullTime;

		// 불!!!!
		const newFire = [];
		while (fire.length > 0) {
			const [x, y] = fire.pop();
			for (let l = 0; l < 4; l++) {
				const nx = x + dx[l];
				const ny = y + dy[l];
				if (
					nx < 0 ||
					nx >= N ||
					ny < 0 ||
					ny >= M ||
					board[nx][ny] == '*' ||
					board[nx][ny] == '#'
				)
					continue;

				if (board[nx][ny] == '.') {
					board[nx][ny] = '*';
					newFire.push([nx, ny]);
				}
			}
		}
		fire = newFire;

		//시간++
		time++;
	}

	return 'IMPOSSIBLE';
}
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
글 보관함