-
반응형
https://www.acmicpc.net/problem/5427
5427번: 불
상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에
www.acmicpc.net
풀이-
간단한 BFS문제이다. 다만 1초일때의 불의움직임과 사람의 움직임, 2초일때의 불의움직임과 사람의 움직임을 맞춰서 탐색해야는것을 주의해주면 된다.
코드
#include <iostream> #include<algorithm> #include<utility> #include<vector> #include<queue> using namespace std; char maze[1000][1000]; int mv[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; pair<int, int> st; queue<pair<int, int>> fire; int n, m; bool isIn(int i, int j) { return 0 <= i && i < n && 0 <= j && j < m; } void fireMoving() { int fsize = fire.size(); for(int k=0;k<fsize;k++){ int x = fire.front().first; int y = fire.front().second; fire.pop(); for (int i = 0; i < 4; i++) { int nx = x + mv[i][0]; int ny = y + mv[i][1]; if (isIn(nx, ny) && maze[nx][ny] != '#'&&maze[nx][ny] != '*') { maze[nx][ny] = '*'; fire.push({ nx,ny }); } } } } void bfs() { queue<pair<pair<int, int>, int>> q; bool visited[1000][1000] = { 0 }; q.push({ st,0 }); visited[st.first][st.second] = true; while (!q.empty()) { fireMoving(); int qsize = q.size(); for (int i = 0; i < qsize; i++) { int x = q.front().first.first; int y = q.front().first.second; int cnt = q.front().second; q.pop(); for (int j = 0; j < 4; j++) { int nx = x + mv[j][0]; int ny = y + mv[j][1]; //탈출 if (!isIn(nx, ny)) { cout << cnt+1<<"\n"; return; } if (!visited[nx][ny] && maze[nx][ny] == '.') { q.push({ { nx,ny },cnt + 1 }); visited[nx][ny] = true; } } } } cout << "IMPOSSIBLE\n"; return ; } void input() { cin >> m >> n; while (!fire.empty()) fire.pop(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> maze[i][j]; if (maze[i][j] == '@') { st = { i,j }; } if (maze[i][j] == '*') { fire.push({ i,j }); } } } } void solve() { int t; cin >> t; while (t--) { input(); bfs(); } } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); solve(); return 0; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 16400번 소수 화폐 (0) 2021.08.10 [백준OJ] 3584번 가장 가까운 공통 조상 (0) 2021.08.09 [백준OJ] 8972번 미친 아두이노 (0) 2021.08.06 [백준OJ] 13460번 구슬 탈출 2 (0) 2021.08.05 [백준OJ] 6118번 숨바꼭질 (0) 2021.08.04 댓글