Submission
Status:
[PPPPP-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: Regent
Problemset: ย่องเบาหลบกับระเบิด
Language: cpp
Time: 0.009 second
Submitted On: 2026-03-05 15:41:43
#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 && !visited[ni][nj]){
grid[ni][nj] = 0;
visited[ni][nj] = true;
}
}
}
//
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(ex == i && ey == j){
return dist[i][j];
}
for(auto [x,y] : delta){
int ni = x + i;
int nj = y + j;
if(ni >= 0 && ni < n && nj >= 0 && nj < m && !visited[ni][nj] && grid[ni][nj] == 1){
q.push({ni,nj});
visited[ni][nj] = true;
dist[ni][nj] = dist[i][j] + 1;
}
}
}
return -1;
}
//
int main(){
Kana;
int n,m;
cin >> n >> m;
vector<vector<int>> grid(n,vector<int>(m));
vector<vector<int>> ans;
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 && !visited[i][j]){
makefalse(i,j,grid,n,m);
}
}
}
//
vector<pair<int,int>> starts;
for(int i = 0;i < m;i++){
if(grid[i][0] != 0){
starts.push_back({i,0});
}
}
vector<pair<int,int>> ends;
for(int i = 0;i < m;i++){
if(grid[i][m-1] != 0){
ends.push_back({i,m-1});
}
}
int mn = INT_MAX;
vector<int> a;
for(auto [sx,sy] : starts){
for(auto [ex,ey] : ends){
memset(dist,false,sizeof(dist));
memset(visited,false,sizeof(visited));
int u = bfs(sx,sy,ex,ey,grid,n,m);
mn = min(mn,u);
a.push_back(u);
}
}
/*
cout << "----------------------------------------------------------------------\n";
for(auto &x : a){
cout << x << '\n';
}
cout << "----------------------------------------------------------------------\n";
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
cout << grid[i][j] << " ";
}cout << '\n';
}
cout << "----------------------------------------------------------------------\n";
cout << "START\n";
for(auto [x,y] : starts){
cout << x << " " << y << '\n';
}
cout << "----------------------------------------------------------------------\n";
cout << "End\n";
for(auto [x,y] : ends){
cout << x << " " << y << '\n';
}
*/
cout << (mn == INT_MAX ? -1 : mn + 1);
return 0;
}