Submission
Status:
[P-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: Regent
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.006 second
Submitted On: 2026-03-05 15:51:37
#include<bits/stdc++.h>
#define Kana ios_base::sync_with_stdio(false);cin.tie(nullptr);
using namespace std;
vector<pair<int,int>> d = {{-1,-1},{1,-1},{-1,1},{1,1},{0,1},{0,-1},{1,0},{-1,0}};
vector<pair<int,int>> delta = {{0,1},{0,-1},{1,0},{-1,0}};
bool visited[1000][1000];
int dist[1000][1000];
void makefalse(int &i,int &j,vector<vector<int>> &grid,int &n,int &m){
for(auto [x,y] : d){
int ni = x + i;
int nj = y + j;
if(ni >= 0 && nj >= 0 && ni < n && nj < m){
grid[ni][nj] = 0;
}
}
}
int bfs(int sx,int sy,int ex,int ey,vector<vector<int>> &grid,int n,int m){
queue<pair<int,int>> q;
if(grid[sx][sy] == 0) return -1;
if(grid[ex][ey] == 0) return -1;
q.push({sx,sy});
visited[sx][sy] = true;
dist[sx][sy] = 0;
while(!q.empty()){
auto [i,j] = q.front();
q.pop();
if(i == ex && j == ey) return dist[i][j];
for(auto [x,y] : delta){
int ni = i + x;
int nj = j + y;
if(ni >= 0 && ni < n && nj >= 0 && nj < m &&
!visited[ni][nj] && grid[ni][nj] == 1){
visited[ni][nj] = true;
dist[ni][nj] = dist[i][j] + 1;
q.push({ni,nj});
}
}
}
return -1;
}
int main(){
Kana;
int n,m;
cin >> n >> m;
vector<vector<int>> grid(n,vector<int>(m));
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
cin >> grid[i][j];
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
if(grid[i][j] == 0){
makefalse(i,j,grid,n,m);
}
}
}
vector<pair<int,int>> starts;
for(int i = 0;i < n;i++){
if(grid[i][0] == 1){
starts.push_back({i,0});
}
}
vector<pair<int,int>> ends;
for(int i = 0;i < n;i++){
if(grid[i][m-1] == 1){
ends.push_back({i,m-1});
}
}
int mn = INT_MAX;
for(auto [sx,sy] : starts){
for(auto [ex,ey] : ends){
memset(dist,0,sizeof(dist));
memset(visited,false,sizeof(visited));
int u = bfs(sx,sy,ex,ey,grid,n,m);
if(u != -1)
mn = min(mn,u);
}
}
cout << (mn == INT_MAX ? -1 : mn + 1);
return 0;
}