Submission
Status:
[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: devilpoohs
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.075 second
Submitted On: 2026-03-05 21:27:03
#include<bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,m;
cin>>n>>m;
int walk[n][m];
int dii[8]={-1,-1,-1,0,0,1,1,1};
int dij[8]={-1,0,1,-1,1,-1,0,1};
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>walk[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(walk[i][j]==0){
for(int k=0;k<8;k++){
int ni=i+dii[k];
int nj=j+dij[k];
if(ni>=0 and ni<n and nj>=0 and nj<m and walk[ni][nj]!=0){
walk[ni][nj]=-1;
}
}
}
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// cout<<walk[i][j]<<' ';
// }
// cout<<'\n';
// }
queue<pair<pair<int,int>,int>> q;
int di[4]={1,-1,0,0};
int dj[4]={0,0,1,-1};
for(int i=0;i<n;i++){
if(walk[i][0]!=0 and walk[i][0]!=-1){
q.push({{i,0},1});
}
}
bool vis[n][m];
memset(vis,false,sizeof(vis));
while(!q.empty()){
auto cur=q.front();
q.pop();
int curi=cur.first.first;
int curj=cur.first.second;
int curw=cur.second;
if(vis[curi][curj] or walk[curi][curj]<=0) continue;
vis[curi][curj]=true;
if(curj==m-1){
cout<<curw;
return 0;
}
for(int i=0;i<4;i++){
int ni=curi+di[i];
int nj=curj+dj[i];
if(ni>=0 and nj>=0 and ni<n and nj<m and walk[ni][nj]>0 ){
q.push({{ni,nj},curw+1});
}
}
}
cout<<"-1";
return 0;
}