๊ณจ๋4 : bfs ๋ฌธ์ ์ด๋ค.
์๊ฐ
๋จ์ํ ๊ตฌํ ๋ฌธ์ ์ด๋ค. ์ด ๋, ์์๋ฅผ ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค. ๋จผ์ , ๋ถ์ ๋ฒ์ง๊ฒ ํ ์ํ์์, ์ฌ๋์ ํ์ฌ ์์น๋ก ๋ถํฐ ์ด๋๋ก ๊ฐ๋ ๊ฒ์ด ์ข์์ง๋ฅผ ํ๋จํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋์ด ๊ฐ์ฅ ์๋ฆฌ์ ๋์ฐฉํ๋ค๋ฉด, ๋ค์๋ฒ์งธ์ ํ์ถ์ด ๊ฐ๋ฅํ๋ค.
Code
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
#include <string.h>
using namespace std;
// BFS๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ ๋ถ์ธ๋ค.
// ๋ถ์ ๋ถ์ด๋ ํ์๋ ์ธ์ ๊น์ง ํ๋ฉด ๋ผ? -> ํ์ถํ๋ฉด ๋ถ ์๋ถ์ฌ๋ ๋ผ
// ๊ทธ๋ ๋ค๋ฉด ์ฌ๋์ด ์์ง์ด๋ ๊ฒ์ ๋ถ์ ๋ถ์ด๋ ํ์๋ ์์กด์
// ๊ทธ๋ผ q๋ฅผ ํ๋๋ง ์ฌ์ฉํ๋ฉด ๋ ๊น?
// ์๋์ผ ๋ถ์ ๋ฐ๋ก ์์ง์ฌ์ผํด
// ์ด๋ ๊ฒ ํ์. ๋ถ์ ์์ ์์น๋ฅผ ๊ฐ์ง๊ณ ์๋ q, ์ฌ๋์ ์์ ์์น๋ฅผ ๊ฐ์ง๊ณ ์๋ q๋ฅผ ๋๊ฐ๋ฅผ ๋ง๋ค์.
// ๊ทธ๋ฆฌ๊ณ ์ฌ๋ q์์ด ๋น์ด์์ ๋๊น์ง ๋ฃจํ๋ฅผ ๋๋ฆฌ๋๋ฐ, ๊ทธ๋ ๋ถ q๋ฅผ ๋๋ฆฌ์.
const int MAX = 1000;
struct Dir{
int y;
int x;
};
Dir moveDir[4] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int W, H;
string graph[MAX];
bool visited[MAX][MAX];
pair<int, int> start;
vector<pair<int, int>> fire;
void printG(){
for (int i = 0; i < H; i++) {
cout << graph[i] << '\n';
}
cout << '\n';
}
int BFS(){
int ans = 0;
queue<pair<int, int>> q;
queue<pair<int, int>> fire_q;
q.push(start);
for (int i = 0; i < int(fire.size()); i++) {
fire_q.push(fire[i]);
}
while (!q.empty()) {
// ๋ถ์ ๋จผ์ ๋ถ์ธ๋ค.
int fireSize = int(fire_q.size());
for (int i = 0; i < fireSize; i++) {
int y = fire_q.front().first;
int x = fire_q.front().second;
fire_q.pop();
for (int j = 0; j < 4; j++) {
int nextY = y + moveDir[j].y;
int nextX = x + moveDir[j].x;
if (0 <= nextY && nextY < H && 0 <= nextX && nextX < W){
if (graph[nextY][nextX] == '.') {
graph[nextY][nextX] ='*';
fire_q.push(make_pair(nextY, nextX));
}
}
}
}
// printG();
// ์ฌ๋์ ์ด๋์ํจ๋ค.
int manSize = int(q.size()); // ์ ์ด๊ฑฐ ์ํด์ฃผ๋ฉด q๊ฐ ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ๋ฐ๋์ด์ ์ด์ํ๊ฒ๋จ..
for (int i = 0; i < manSize; i++) {
int y = q.front().first;
int x = q.front().second;
q.pop();
// ๊ฐ์ฅ ์๋ฆฌ์ ์์ ๊ฒฝ์ฐ์๋ ๋ค์๋ฒ์ ํ์ถ์ด๋ค.
if (y == 0 || y == H-1 || x == 0 || x == W-1)
return ans + 1;
for (int i = 0; i < 4; i++) {
int nextY = y + moveDir[i].y;
int nextX = x + moveDir[i].x;
if (0 <= nextY && nextY < H && 0 <= nextX && nextX < W){
if (visited[nextY][nextX] == false && graph[nextY][nextX] != '*' && graph[nextY][nextX] != '#') {
visited[nextY][nextX] = true;
q.push(make_pair(nextY, nextX));
}
}
}
}
ans++;
// printG();
}
return -1;
}
int main(){
int T;
cin >> T;
for (int tc = 0; tc < T; tc++) {
// tc ๋ฌธ์ ์์๋ ๋ฐฐ์ด์ ์ด๊ธฐํ ํด์ฃผ๋ ๊ฒ์ ๊น๋จน์ผ๋ฉด ์๋๋ค.
fire.clear();
memset(visited, false, sizeof(visited));
cin >> W >> H;
for (int i = 0; i < H; i++) {
cin >> graph[i];
for (int j = 0; j < W; j++) {
if (graph[i][j] == '@') {
start = make_pair(i, j);
visited[i][j] = true;
}
else if (graph[i][j] == '*') fire.push_back(make_pair(i, j));
}
}
int ans = BFS();
if (ans == -1) cout << "IMPOSSIBLE" << '\n';
else cout << ans << '\n';
}
return 0;
}