Softeer
Softeer GINI야 도와줘 c++
콩순이냉장고
2024. 11. 15. 18:44
문제 URL : https://softeer.ai/practice/6271
문제 접근법 : bfs를 두번사용하면 되는문제입니다.
소나기가 먼저퍼진후, 그다음 시작점에서 끝점까지 갈수있는지 확인하는 단순 bfs문제입니다.
처음 할때 실수로 시작점과 끝점을 바꿔서 코딩하다가 1시간넘게 안풀려서 의아했었는데
시작포인트와 끝포인트가 달라졌다는것을 깨닫고 풀렸네요
소스코드 :
//By 콩순이냉장고
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> board;
vector<pair<int,int>> rv;
int sy,sx,fy,fx;
int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};
void input(){
cin>>n>>m;
char c;
board = vector<vector<int>>(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j =0;j<m;j++){
cin>>c;
if(c=='H'){
tie(fy,fx)={i,j};
}
else if(c=='W'){
tie(sy,sx)={i,j};
}
else if(c=='*'){
rv.push_back({i,j});
}
else if(c=='X'){
board[i][j]=1;
}
}
}
}
bool isrange(int y,int x){
return 0<=y&&y<n&&0<=x&&x<m;
}
vector<vector<int>> bfs(vector<pair<int,int>> &v,vector<vector<int>> check,int rain){
queue<tuple<int,int,int>> q;
for(int i =0;i<v.size();i++){
q.push({v[i].first,v[i].second,0});
check[v[i].first][v[i].second]=0;
}
while(!q.empty()){
int y,x,cnt;
tie(y,x,cnt)=q.front();
q.pop();
for(int i =0;i<4;i++){
int ny=y+dy[i];
int nx=x+dx[i];
if(isrange(ny,nx)&&cnt+1<check[ny][nx]&&board[ny][nx]==0){
if(rain){
if((ny==sy&&nx==sx) ||(ny==fy&&nx==fx))continue;
q.push({ny,nx,cnt+1});
check[ny][nx]=cnt+1;
}
else{
q.push({ny,nx,cnt+1});
check[ny][nx]=cnt+1;
}
}
}
}
return check;
}
void solve(){
vector<vector<int>> check(n,vector<int>(m,1e8));
vector<vector<int>> check2 = bfs(rv,check,1);
vector<pair<int,int>> p={{sy,sx}};
vector<vector<int>> res = bfs(p,check2,0);
if(check2[fy][fx]==res[fy][fx]){
cout<<"FAIL"<<"\n";
}
else{
cout<<res[fy][fx]<<"\n";
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
input();
solve();
}
궁금한점 혹은 모르는점 어떤 질문이든 댓글은 언제나 환영입니다.