image


这种最短路径问题应该用 BFS 解决。

C++49 linesExpandCollapse
#include <bits/stdc++.h>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    
    vector<vector<int>> grid(m, vector<int>(n));
    
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> grid[i][j];
        }
    }
    
    queue<pair<int, int>> q;
    
    // dist[i][j] 表示从起点到 (i, j) 的最短距离,-1 表示未访问过
    vector<vector<int>> dist(m, vector<int>(n, -1));
    
    q.push({0, 0});
    dist[0][0] = 0;
    
    int dx[4] = {1, -1, 0, 0};
    int dy[4] = {0, 0, 1, -1};
    
    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();
        if (x == m - 1 && y == n - 1) {
            cout << dist[x][y] << endl;
            return 0;
        }
        
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k];
            int ny = y + dy[k];
            
            if (nx < 0 || ny < 0 || nx >= m || ny >= n 
                || grid[nx][ny] == 1 || dist[nx][ny] != -1) continue;
            
            dist[nx][ny] = dist[x][y] + 1;
            q.push({nx, ny});
        }
    }
    cout << -1 << endl;
    
    return 0;
}