- ์ด ๊ธ์ c++๋ก ํ์ด๋ฅผ ์์ฑํ์์ต๋๋ค.
๋ฌธ์
์์
ํ์ด
- BFS ํ์ฉํ๋ ๋ฌธ์ ๋ก ๋ถ์ ์์์ ์์ BFS๋ฅผ ๋๋ฆฐ ํ ์งํ์ด๋ฅผ BFS๋ฅผ ์งํํ์ฌ ๋ถ์ด ๋จผ์ ํ์ฐ๋ ๊ฒฝ์ฐ ์งํํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฃผ์ํด์ผํ ์ ์ 2๊ฐ์ง๋ก ๋ถ์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ์ ์๋ค๋ ์ ๊ณผ, ๋ถ์ด ์์ ์๋ ์๋ค๋ ์ ์
๋๋ค.
- ์ฆ, ๋ถ์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌ๋ BFS๋ฅผ ๋๊ฐ์ด ํด๋ ๊ด์ฐฎ์ง๋ง, ๋ถ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ถ์ด ์ด๋ํ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ด๊ธฐํ์ธ ์ํ ๊ทธ๋๋ ์์ต๋๋ค.
#include<iostream>
#include<queue>
#include<utility>
#include<string>
using namespace std;
int n,m;
int arr[1000][1000];
int fdist[1000][1000];
int jdist[1000][1000];
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
bool inside(int y,int x){
return 0<=y && y<n && 0<=x && x<m;
}
bool isboarder(int y,int x){
return y == 0 || x == 0 || y == n-1 || x == m-1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
queue<pair<int,int>> fq;
queue<pair<int,int>> jq;
for(int i=0;i<n;i++){
string s;
cin>>s;
for(int j=0;j<m;j++){
if(s[j] == '#'){
arr[i][j] = -1;
}else if(s[j] == '.'){
arr[i][j] = 0;
}else if(s[j] == 'J'){
arr[i][j] = 1;
jq.push({i,j});
jdist[i][j] = 1;
}else{
arr[i][j] = 2;
fq.push({i,j});
fdist[i][j] = 1;
}
}
}
while(!fq.empty()){
int y = fq.front().first;
int x = fq.front().second;
fq.pop();
for(int i=0;i<4;i++){
int dy = y + dir[i][0];
int dx = x + dir[i][1];
if(inside(dy,dx) && arr[dy][dx]!=-1 && !fdist[dy][dx]){
fq.push({dy,dx});
fdist[dy][dx] = fdist[y][x] + 1;
}
}
}
while(!jq.empty()){
int y = jq.front().first;
int x = jq.front().second;
jq.pop();
for(int i=0;i<4;i++){
int dy = y + dir[i][0];
int dx = x + dir[i][1];
if(!inside(dy, dx)){
cout<<jdist[y][x];
return 0;
}
if(arr[dy][dx]!=-1 && jdist[dy][dx] == 0){
if(fdist[dy][dx] == 0 || (jdist[y][x] + 1 < fdist[dy][dx])){
jq.push({dy,dx});
jdist[dy][dx] = jdist[y][x] + 1;
}
}
}
}
cout<<"IMPOSSIBLE";
}
- ์ถ๊ฐ๋ก ๊ถ๊ธํ ์ ์ด๋ ์์ ํ ๋ถ๋ถ ์์ผ๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์,.