Submission

Status:

[PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: konthaina_TH

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

Language: cpp

Time: 0.097 second

Submitted On: 2026-03-07 10:56:05

#include <bits/stdc++.h>

using namespace std;

struct Node {
    int r,c,dist;
};

int main() {
    int n,m;
    cin >> n >> m;
    vector<vector<int>>base(n+2,vector<int>(m+2,1));

    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            int x;
            cin >> x;
            if (x == 0) {
                base[i][j] = 0;
                base[i][j-1] = 0;
                base[i][j+1] = 0;
                base[i-1][j] = 0;
                base[i+1][j] = 0;
                base[i+1][j+1] = 0;
                base[i-1][j-1] = 0;
                base[i+1][j-1] = 0;
                base[i-1][j+1] = 0;
            }
        }
    }
    queue<Node> q;
    vector<vector<bool>> visited(n+1,vector<bool>(m+1,false));

    for (int i=1;i<=n;i++) {
        if (base[i][1] == 1) {
            q.push({i,1,1});
            visited[i][1] = true;
        }
    }
    int dr[] = {-1,1,0,0};
    int dc[] = {0,0,-1,1};

    while (!q.empty()) {
        Node curr = q.front();
        q.pop();

        if (curr.c == m) {
            cout << curr.dist << "\n";
            return 0;
        }

        for (int i=0;i<4;i++) {
            int nr = curr.r + dr[i];
            int nc = curr.c + dc[i];

            if (nr >= 1 and nr <= n and nc >= 1 and nc <= m and !visited[nr][nc] and base[nr][nc] == 1) {
                visited[nr][nc] = true;
                q.push({nr,nc,curr.dist + 1});
            }
        }
    }
    cout << "-1";
    return 0;

}