https://www.acmicpc.net/submit/4179/87026900
ํ๋ฆฐ ์๊ฐ
: ๋ฌธ์ ๋ฅผ ํ ๋ ๋๋ ์งํ์ด bfs ์ฒ๋ฆฌ ํ, ๋ถ bfs ์ด๋ํ๋ ค๊ณ ํ๋๋ฐ
์ด๋ฐ์์ผ๋ก ํ๊ธฐ์๋ ๊ฐ ํ 2๊ฐ๋ฅผ ๋ง๋ค์ด์ ์ฒ๋ฆฌํด์ผ ํ๋๋ฐ,
์ํ์ค ์์ฑ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ์ ๋ํ ๋ฌธ์ ๊ฐ ์๋ค.
ํฐ๋๋ ๊ฐ์๋ฅผ ๋ณธํ ์ ๋ต ์์
: ์ด์จ๋ ์งํ์ด๋ ํ
๋๋ฆฌ๋ฅผ ํฅํด์ ํ์ถํ๋ ค๊ณ ํ๋๋ฐ, ๊ฐ ์ ์ ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ก ํฅํ๋ ๊ฒ๊ณผ
๋ถ์ด ํด๋น ์ ์ ์ผ๋ก ๋ฒ์ ธ๋๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํ๋ ๋ฐฉ์์ผ๋ก ํ๋ฉด
์งํ์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํต๊ณผ๊ฐ๋ฅํ ๊ฒ์ธ๊ฐ์ ๋ํ ๋
ผ๋ฆฌ์ ์ธ ์๊ฐ์ ํ ์ ์๋ค.
์งํ์ด๊ฐ ์ด๋ํ ์ ์๋ ๊ฐ ์ ์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ์ด๋ ๋ค.
๊ทธ๋ฌ๋ฉด ๋ถ์ ๊ฐ ์ ์ ์์์ ์ต๋จ๊ฒฝ๋ก๋?
์งํ์ด์ ๋นจ๊ฐ ์ต๋จ๊ฑฐ๋ฆฌ๊ณผ ๋ถ์ ํ๋ ์ต๋จ ๊ฒฝ๋ก๋ ๋น๊ตํ๋ฉด
: ํ
๋๋ฆฌ๋ฅผ ํตํด ํต๊ณผํด์ผ ํ๋ฏ๋ก, ์งํ์ด๋ ์ข์ธก ํ๋จ์ 2๋ฅผ ํตํด
๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋ค.
์งํ์ด์ ์
์ฅ์์ 3์ ํด๋นํ๋ ์ ์ ์ด ๋ถ์ ์
์ฅ์์ ๋ณด๋ฉด, 2์ด๊ธฐ ๋๋ฌธ์
3์ผ๋ก๋ ์ ๋ ํต๊ณผํ ์ ์๋ค. ๋ถ์ ํ ์ฃฝ์...
-> ์ด๊ฑฐ๋ฅผ ์ผ๋ํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
: ์ฌ๊ธฐ์ ์๊ฐํ ์ ์๋ ๋ถ๋ถ์ ๋ถ์ ๋จผ์ ํ์ํด์ ํ๋์์ซ์๋๋ก
์ ์ฅ์ ํด๋๊ณ , ๋นจ๊ฐ์ 3์ ์งํํ ํ์๊ฐ ์๋ค. ํด๋น ์ ์ ์ ๋ถ์ ๊ฒฝ๋ก๋ณด๋ค
๋ ๊ธธ๊ธฐ ๋๋ฌธ์
: bfs
ํ์ด๋ฒ : ๋ฌธ์ ์์ ์ฃผ์ด์ง์ง ์์์ฐ๋ง,
๋ถ์ ๋จผ์ ์ด๋ํ๊ณ , ์งํ์ด๋ฅผ ์ด๋์์ผ์ผ ํจ.
๋งจ ๋ฐ์ ๋ฐ๋ก ์์.
https://www.acmicpc.net/board/view/63687
๋ด๊ฐ ๋ง๋ ์ฝ๋๋๋ก ํ๋ฉด ํ์ถ์ ํ๊ฒ ๋๋๋ฐ/
RESULT : ์ด๋ ์งํ์ด๋ ํ์ถ์ ๋ชปํด์ผ ํจ.
์ ํ์ถ์ ๋ชปํด์ผ ํ๋๋ฉด?
๋ ผ๋ฆฌ์ ์ผ๋ก ์๊ฐํ๋ฉด, '.' ์ด์๋ ๋ถ๋ถ์ ๋ถ๊ณผ ์งํ์ด๊ฐ ๋ชจ๋ ์ฌ์ ์์.
๊ทธ๋ผ ์งํ์ด๋ ํ์ถ์ ๋ชปํ๊ฒ ๋๋ ์ํฉ์.
๋ฐ๋ผ์ ๋ถ์ ๋จผ์ ์ด๋ํด์ผ ํ๋ ํ๋ก์ธ์ค ๋ง์.
-> 58ํผ์ผํธ ์์ ํ๋ฆผ.
ํ์ฌ ์งํ์ด๋ฅผ ๋จผ์ ์ด๋ํ ํ์, ๋ถ์ ์ด๋์์ผฐ์..
์ด์ ๋ฌธ์ ๊ฐ ์๋๋ค.
#include <iostream>
#include <vector>
using namespace std;
#include <algorithm>
#include <queue>
#include <string>
// 15:50
// ์ํ์ข์ฐ
int dy[]{ -1,1,0,0 };
int dx[]{ 0,0,-1,1 };
int n, m;
// ์งํ์ด๊ฐ ๋จผ์ ์ด๋ํด์ผ ํจ.
// ์งํ์ด๋ ๋ถ์ด ์๋ ๊ณณ, ๋ฒฝ์ด ์๋๊ณณ, ์ผ๋ก๋ง ์์ง์ผ ์ ์๊ณ ,
// ์งํ์ด๋ ๋ฏธ๋ก ๊ฐ์ฅ์๋ฆฌ์์ ํ์ถ์ด ๊ฐ๋ฅํจ. ํ์ถํ ๋์ ์ต๋จ ์๊ฐ์
// ์์์ผ ํจ.
void bfs(vector<vector<char>>&v, vector<vector<bool>>&_check,
pair<int,int>&_jh, vector<pair<int,int>>&f)
{
//๋ฒฝ์ ๋ณํ์ง ์์.
// ์ถ๊ฐ๋์ง๋ ์์.
// . ๊ณต๊ฐ์ ๋ถ์ด ๋ ์ ์์.
queue < pair<pair<int, int> , int> >qF;
for (auto iter : f)
{
qF.push(make_pair(make_pair(iter.first, iter.second), 0));
}
queue<pair<pair<int, int> , int>>pos;
pos.push(make_pair(make_pair(_jh.first, _jh.second), 0));
_check[_jh.first][_jh.second] = true;
// ์งํ์ด๊ฐ ์ด๋์๋ฃ๋ ๋ถ๋ถ์ ์ฒดํฌ๋ถ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํจ.
while (!pos.empty())
{
int curY = pos.front().first.first;
int curX = pos.front().first.second;
int cnt = pos.front().second;
pos.pop();
// ๋ง์ฝ์ ์งํ์ด๊ฐ ํ
๋๋ฆฌ ๋์ฐฉ์ ๊ทธ๋ฅ ๋.
if (curY == 0 || curY == n -1
|| curX == 0 || curX == m - 1)
{
cout << cnt + 1;
return;
}
// ์งํ์ด๊ฐ ์๋ ์์น๋ . ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํจ.
v[curY][curX] = '.';
// ์งํ์ด ์ด๋ ๋ถํฐ.
for (int i = 0; i < 4; ++i)
{
int nextY = curY + dy[i];
int nextX = curX + dx[i];
//ํ
๋๋ฆฌ ํ์ธ
if (nextY < 0 || nextY >= n
|| nextX < 0 || nextX >= m)
continue;
// ๋ฒฝ ํ์ธ
if (v[nextY][nextX] == '#'
|| v[nextY][nextX] == 'F')
continue;
// ์ด๋ํ ์ ์๋ ๋ถ๋ถ์ ๋ถ์ฒดํฌ
if (_check[nextY][nextX] == true)
continue;
// ์ง๋๊ฐ์ ์๋ ๊ณต๊ฐ์ผ ๊ฒฝ์ฐ์ ์ด๋ํจ
if (v[nextY][nextX] == '.')
{
pos.push(make_pair(make_pair(nextY, nextX),
cnt + 1));
_check[nextY][nextX] = true;
}
}
// ๋ถ ํ์ฐ์ ํด์ผํจ.
// ์ผ๋จ qF์ ์๋ ๊ฒ๋ค์ ํ์ฐํด์ผ ํจ.
// 2๋ฒ์งธ ์ธ์์ ์๋ ๊ฐ์ ํตํด์๋ง ํ์ฐ ์๋ฃ
// ๊ทธ ์ดํ์๋ ๋ฐ์ณ ๋์์ผ ํจ.
while (!qF.empty())
{
// ์นด์ดํ
ํ์์ ๋น๊ตํด์ ์ผ์นํ ์นด์ดํธ๋ง ๋๋ ค์ผ ํจ.
int cntF = qF.front().second;
if (cnt != cntF)
break;
int curFY = qF.front().first.first;
int curFX = qF.front().first.second;
qF.pop();
// ๋ถํ์ฐ.
for (int i = 0; i < 4; ++i)
{
int nextFY = curFY + dy[i];
int nextFX = curFX + dx[i];
//ํ
๋๋ฆฌ ํ์ธ
if (nextFY < 0 || nextFY >= n
|| nextFX < 0 || nextFX >= m)
continue;
// ๋ฒฝ ํ์ธ
if (v[nextFY][nextFX] == '#'
|| v[nextFY][nextFX] == 'F')
continue;
// ๋ฒฝ ์๋๊ณ , ๋ถ์ด ์๋ ๋ถ๋ถ์ ๋ถ๋ก ๋ง๋ค์ด ๋ฒ๋ฆผ.
v[nextFY][nextFX] = 'F';
qF.push(make_pair(make_pair(nextFY, nextFX), cntF + 1));
}
}
}
// ์งํ์ด๊ฐ ํ์ถํ ์ ์์๋ ์๊ฐํด์ผ ํจ.
cout << "IMPOSSIBLE";
}
int main()
{
// ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ๊ฐ ํ์ถ ๊ณต๊ฐ์.
// ๋ถ๊ณผ ์งํ์ด 1์ด๋ง๋ค ์ด๋ํจ.
// ๋ถ์ ๋จผ์ ํ์ฐํด์ผ ํจ.
cin >> n >> m;
vector<vector<char>>v(n, vector<char>(m));
//์งํ์ด์ ์ด๊ธฐ ์์น
// ๋ถ์ ์ด๊ธฐ ์์น
pair<int, int>jihoon;
vector<pair<int, int>>fire;
// ์งํ์ด๊ฐ ์ด๋์๋ฃ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๋ถ๋ณ์
vector<vector<bool>>check(n, vector<bool>(m));
for (int i = 0; i < n; ++i)
{
string word;
cin >> word;
for (int j = 0; j < m; ++j)
{
v[i][j] = word[j];
if (v[i][j] == 'J')
{
jihoon.first = i;
jihoon.second = j;
}
if (v[i][j] == 'F')
{
fire.push_back(make_pair(i, j));
}
}
}
//cout << jihoon.first << ' ' << jihoon.second << endl;
//
//for (auto iter : fire)
//{
// cout << iter.first << ' ' << iter.second << endl;
//}
bfs(v, check, jihoon, fire);
}
#include <iostream>
#include <vector>
using namespace std;
#include <algorithm>
#include <queue>
#include <string>
// 15:50
// ์ํ์ข์ฐ
int dy[]{ -1,1,0,0 };
int dx[]{ 0,0,-1,1 };
int n, m;
// ์งํ์ด๊ฐ ๋จผ์ ์ด๋ํด์ผ ํจ.
// ์งํ์ด๋ ๋ถ์ด ์๋ ๊ณณ, ๋ฒฝ์ด ์๋๊ณณ, ์ผ๋ก๋ง ์์ง์ผ ์ ์๊ณ ,
// ์งํ์ด๋ ๋ฏธ๋ก ๊ฐ์ฅ์๋ฆฌ์์ ํ์ถ์ด ๊ฐ๋ฅํจ. ํ์ถํ ๋์ ์ต๋จ ์๊ฐ์
// ์์์ผ ํจ.
void bfs(vector<vector<char>>&v, vector<vector<bool>>&_check,
pair<int,int>&_jh, vector<pair<int,int>>&f)
{
//๋ฒฝ์ ๋ณํ์ง ์์.
// ์ถ๊ฐ๋์ง๋ ์์.
// . ๊ณต๊ฐ์ ๋ถ์ด ๋ ์ ์์.
queue < pair<pair<int, int> , int> >qF;
for (auto iter : f)
{
qF.push(make_pair(make_pair(iter.first, iter.second), 0));
}
queue<pair<pair<int, int> , int>>pos;
pos.push(make_pair(make_pair(_jh.first, _jh.second), 0));
_check[_jh.first][_jh.second] = true;
// ์งํ์ด๊ฐ ์ด๋์๋ฃ๋ ๋ถ๋ถ์ ์ฒดํฌ๋ถ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํจ.
while (!pos.empty())
{
int curY = pos.front().first.first;
int curX = pos.front().first.second;
int cnt = pos.front().second;
// ๋ถ ํ์ฐ์ ํด์ผํจ.
// ์ผ๋จ qF์ ์๋ ๊ฒ๋ค์ ํ์ฐํด์ผ ํจ.
// 2๋ฒ์งธ ์ธ์์ ์๋ ๊ฐ์ ํตํด์๋ง ํ์ฐ ์๋ฃ
// ๊ทธ ์ดํ์๋ ๋ฐ์ณ ๋์์ผ ํจ.
while (!qF.empty())
{
// ์นด์ดํ
ํ์์ ๋น๊ตํด์ ์ผ์นํ ์นด์ดํธ๋ง ๋๋ ค์ผ ํจ.
int cntF = qF.front().second;
if (cnt != cntF)
break;
int curFY = qF.front().first.first;
int curFX = qF.front().first.second;
qF.pop();
// ๋ถํ์ฐ.
for (int i = 0; i < 4; ++i)
{
int nextFY = curFY + dy[i];
int nextFX = curFX + dx[i];
//ํ
๋๋ฆฌ ํ์ธ
if (nextFY < 0 || nextFY >= n
|| nextFX < 0 || nextFX >= m)
continue;
// ๋ฒฝ ํ์ธ
if (v[nextFY][nextFX] == '#'
|| v[nextFY][nextFX] == 'F')
continue;
// ๋ฒฝ ์๋๊ณ , ๋ถ์ด ์๋ ๋ถ๋ถ์ ๋ถ๋ก ๋ง๋ค์ด ๋ฒ๋ฆผ.
v[nextFY][nextFX] = 'F';
qF.push(make_pair(make_pair(nextFY, nextFX), cntF + 1));
}
}
// ์ฌ๊ธฐ๋ก ์ฎ๊น
pos.pop();
// ๋ง์ฝ์ ์งํ์ด๊ฐ ํ
๋๋ฆฌ ๋์ฐฉ์ ๊ทธ๋ฅ ๋.
if (curY == 0 || curY == n - 1
|| curX == 0 || curX == m - 1)
{
cout << cnt + 1;
return;
}
// ์งํ์ด๊ฐ ์๋ ์์น๋ . ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํจ.
v[curY][curX] = '.';
// ์งํ์ด ์ด๋ ๋ถํฐ.
for (int i = 0; i < 4; ++i)
{
int nextY = curY + dy[i];
int nextX = curX + dx[i];
//ํ
๋๋ฆฌ ํ์ธ
if (nextY < 0 || nextY >= n
|| nextX < 0 || nextX >= m)
continue;
// ๋ฒฝ ํ์ธ
if (v[nextY][nextX] == '#'
|| v[nextY][nextX] == 'F')
continue;
// ์ด๋ํ ์ ์๋ ๋ถ๋ถ์ ๋ถ์ฒดํฌ
if (_check[nextY][nextX] == true)
continue;
// ์ง๋๊ฐ์ ์๋ ๊ณต๊ฐ์ผ ๊ฒฝ์ฐ์ ์ด๋ํจ
if (v[nextY][nextX] == '.')
{
pos.push(make_pair(make_pair(nextY, nextX),
cnt + 1));
_check[nextY][nextX] = true;
}
}
}
// ์งํ์ด๊ฐ ํ์ถํ ์ ์์๋ ์๊ฐํด์ผ ํจ.
cout << "IMPOSSIBLE";
}
int main()
{
// ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ๊ฐ ํ์ถ ๊ณต๊ฐ์.
// ๋ถ๊ณผ ์งํ์ด 1์ด๋ง๋ค ์ด๋ํจ.
// ๋ถ์ ๋จผ์ ํ์ฐํด์ผ ํจ.
cin >> n >> m;
vector<vector<char>>v(n, vector<char>(m));
//์งํ์ด์ ์ด๊ธฐ ์์น
// ๋ถ์ ์ด๊ธฐ ์์น
pair<int, int>jihoon;
vector<pair<int, int>>fire;
// ์งํ์ด๊ฐ ์ด๋์๋ฃ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๋ถ๋ณ์
vector<vector<bool>>check(n, vector<bool>(m));
for (int i = 0; i < n; ++i)
{
string word;
cin >> word;
for (int j = 0; j < m; ++j)
{
v[i][j] = word[j];
if (v[i][j] == 'J')
{
jihoon.first = i;
jihoon.second = j;
}
if (v[i][j] == 'F')
{
fire.push_back(make_pair(i, j));
}
}
}
//cout << jihoon.first << ' ' << jihoon.second << endl;
//
//for (auto iter : fire)
//{
// cout << iter.first << ' ' << iter.second << endl;
//}
bfs(v, check, jihoon, fire);
}