Submission

Status:

[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Ninstroyer

Problemset: ย่องเบาหลบกับระเบิด

Language: cpp

Time: 0.114 second

Submitted On: 2025-12-17 20:15:01

#include <bits/stdc++.h>
using namespace std;
const int nx = 1e3+5;

vector<pair<int,int>> dir = {{0,-1}, {0,1}, {1,0}, {-1, 0}, {-1, 1}, {-1,-1}, {1,-1}, {1,1}};

int main()
{
    int n, m; cin>>n>>m;
    vector<vector<int>> arr(nx, vector<int>(nx));
    vector<vector<int>> marked(nx, vector<int>(nx, 0));
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            cin>>arr[i][j];
            if(arr[i][j] == 0) marked[i][j] = 1;
        }
    }
    
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(marked[i][j])
            {
                for(int k = 0; k < 8; k++)
                {
                    auto [x,y] = dir[k];
                    arr[i+x][j+y] = 0;
                }
            }
        }
    }

    queue<pair<int,int>> q;
    vector<vector<int>> dist(nx, vector<int>(nx, 1e9+5));
    vector<vector<bool>> visited(nx, vector<bool>(nx, false));
    for(int i = 1; i <= n; i++)
    {
        if(arr[i][1] != 0) q.push({i, 1});
        else continue;
        dist[i][1] = 1;
        visited[i][1] = true;
    }
    while(!q.empty())
    {
        auto [i,j] = q.front();
        q.pop();
        for(int k = 0; k < 4; k++)
        {
            auto [x,y] = dir[k];
            int ni = i+x;
            int nj = j+y;
            if(ni > n || ni < 1 || nj > m || nj < 1) continue;
            if(arr[ni][nj] && !visited[ni][nj])
            {
                dist[ni][nj] = dist[i][j] + 1;
                q.push({ni, nj});
                visited[ni][nj] = true;
            }
        }
    }

    int ans = 1e9+5;
    for(int i = 1; i <= n; i++)
    {
        ans = min(ans, dist[i][m]);
    }
    cout<<(ans == 1e9+5 ? -1 : ans);
}