BFS๋ฅผ 2๋ฒ ๋๋ฆฌ๋ ๋ฌธ์ !๐ฅ
'ํ๋ชจ ๊ฑธ๋ฆด๋ปํ๋ค.'
์๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ํ ์ ์ถ ์ ๋ต ๋งํ ์ฌ๋ ์ ๋ต ๋น์จ
1 ์ด 256 MB 17718 4275 2912 22.160%
๋ฌธ์
์งํ์ด๋ ๋ฏธ๋ก์์ ์ผ์ ํ๋ค. ์งํ์ด๋ฅผ ๋ฏธ๋ก์์ ํ์ถํ๋๋ก ๋์์ฃผ์!
๋ฏธ๋ก์์์ ์งํ์ด์ ์์น์ ๋ถ์ด ๋ถ์ ์์น๋ฅผ ๊ฐ์ํด์ ์งํ์ด๊ฐ ๋ถ์ ํ๊ธฐ์ ์ ํ์ถํ ์ ์๋์ง์ ์ฌ๋ถ, ๊ทธ๋ฆฌ๊ณ ์ผ๋ง๋ ๋นจ๋ฆฌ ํ์ถํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํด์ผํ๋ค.
์งํ์ด์ ๋ถ์ ๋งค ๋ถ๋ง๋ค ํ์นธ์ฉ ์ํ๋๋ ์์ง์ผ๋ก(๋น์ค๋ฌํ๊ฒ ์ด๋ํ์ง ์๋๋ค) ์ด๋ํ๋ค.
๋ถ์ ๊ฐ ์ง์ ์์ ๋ค ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋๋ค.
์งํ์ด๋ ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ์ ์ ํ ๊ณต๊ฐ์์ ํ์ถํ ์ ์๋ค.
์งํ์ด์ ๋ถ์ ๋ฒฝ์ด ์๋ ๊ณต๊ฐ์ ํต๊ณผํ์ง ๋ชปํ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ ์ ์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. ๋จ, 1 โค R, C โค 1000 ์ด๋ค. R์ ๋ฏธ๋ก ํ์ ๊ฐ์, C๋ ์ด์ ๊ฐ์์ด๋ค.
๋ค์ ์ ๋ ฅ์ผ๋ก R์ค๋์ ๊ฐ๊ฐ์ ๋ฏธ๋ก ํ์ด ์ฃผ์ด์ง๋ค.
๊ฐ๊ฐ์ ๋ฌธ์๋ค์ ๋ค์์ ๋ปํ๋ค.
#: ๋ฒฝ
.: ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ
J: ์งํ์ด์ ๋ฏธ๋ก์์์ ์ด๊ธฐ์์น (์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ)
F: ๋ถ์ด ๋ ๊ณต๊ฐ
J๋ ์ ๋ ฅ์์ ํ๋๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์งํ์ด๊ฐ ๋ถ์ด ๋๋ฌํ๊ธฐ ์ ์ ๋ฏธ๋ก๋ฅผ ํ์ถ ํ ์ ์๋ ๊ฒฝ์ฐ IMPOSSIBLE ์ ์ถ๋ ฅํ๋ค.
์งํ์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ถ์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
4 4
####
#JF#
#..#
#..#
์์ ์ถ๋ ฅ 1
3
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int dist_fire[1001][1001];
int run[1001][1001];
string maze[1001];
int dx[]{ -1,1,0,0 };
int dy[]{ 0,0,-1,1 };
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int r, c;
cin >> r >> c;
queue<pair<int, int>> Q_fire;
queue<pair<int, int>> Q_run;
for (int i = 0; i < r; i++)
{
cin >> maze[i];
}
for(int i = 0 ; i < r; i ++)
for (int j = 0; j < c; j++)
{
dist_fire[i][j] = -1;
run[i][j] = -1;
}
for (int i = 0; i < r; i++)
{
int j = 0;
for (auto& e : maze[i])
{
if (e == 'F')
{
Q_fire.push({i,j});
dist_fire[i][j] = 0;
}
j++;
}
}
for (int i = 0; i < r; i++)
{
int j = 0;
for (auto& e : maze[i])
{
if (e == 'J')
{
Q_run.push({ i,j });
run[i][j] = 0;
}
j++;
}
}
//1st bfs
while (!Q_fire.empty())
{
auto cur = Q_fire.front(); Q_fire.pop();
for (int i = 0; i < 4; i++)
{
int nx = cur.X + dx[i];
int ny = cur.Y + dy[i];
if (nx < 0 || nx >= r || ny < 0 || ny >= c) continue;
if (maze[nx][ny] == '#' || dist_fire[nx][ny] >= 0) continue;
Q_fire.push({ nx,ny });
dist_fire[nx][ny] = dist_fire[cur.X][cur.Y] + 1;
}
}
//2st bfs
while (!Q_run.empty())
{
auto cur = Q_run.front(); Q_run.pop();
for (int i = 0; i < 4; i++)
{
int nx = cur.X + dx[i];
int ny = cur.Y + dy[i];
if (nx < 0 || nx >= r || ny < 0 || ny >= c)
{
cout << run[cur.X][cur.Y] + 1;
return 0;
}
if (maze[nx][ny] == '#' || run[nx][ny] >= 0) continue;
if (dist_fire[nx][ny] != -1 && dist_fire[nx][ny] <= run[cur.X][cur.Y] + 1) continue;
Q_run.push({ nx,ny });
run[nx][ny] = run[cur.X][cur.Y] + 1;
}
}
cout << "IMPOSSIBLE";
return 0;
}