【BFS (有点dijskra的味)】1091. 二进制矩阵中的最短路径

class Solution {
public:

    void bfs(vector<vector<int>>& grid){
        record[0][0] = 1;
        p_q.push(make_pair(0,0));
        int cur_x, cur_y;
        int len_x = grid.size();
        int len_y = grid[0].size();
        is_go[0][0] = true;
        while(!p_q.empty()){
            cur_x = p_q.front().first;
            cur_y = p_q.front().second;
            p_q.pop();
            for(int i=0;i<8;++i){
                int target_x = cur_x + dir[i][0];
                int target_y = cur_y + dir[i][1];
                if((target_x >= 0 && target_x < len_x) 
                    && ( target_y >= 0 && target_y < len_y) 
                    && grid[target_x][target_y] == 0 
                    && !is_go[target_x][target_y]){
                    if(record[target_x][target_y] == -1)
                        record[target_x][target_y] = record[cur_x][cur_y] + 1;
                    else
                        record[target_x][target_y] = min(record[target_x][target_y], record[cur_x][cur_y] + 1);
                    if(!is_go[target_x][target_y]){ // 注意不要重复入队列
                        p_q.push(make_pair(target_x,target_y));
                        is_go[target_x][target_y] = true;
                    }
                }
            }
        }
    }

    int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
        if(grid[0][0] != 0)
            return -1;
        int len_x = grid.size();
        int len_y = grid[0].size();
        record = new int*[len_x];
        is_go = new bool*[len_x];
        for(int i=0;i<len_x;++i){
            record[i] = new int[len_y];
            is_go[i] = new bool[len_y];
            for(int j=0;j<len_y;++j){
                record[i][j] = -1;
                is_go[i][j] = false;
            }
        }
        bfs(grid);
        int result = record[len_x-1][len_y-1];
        for(int i=0;i<len_x;++i){
            delete []is_go[i];
            delete []record[i];
        }
        delete []is_go;
        delete []record;
        return result;
    }
private:
    int **record;
    bool **is_go;
    queue <pair<int, int>> p_q;
    int dir[8][2] = {
        {-1,0},   {-1,1},  
        {0,1},    {1,1},   
        {1,0},    {1,-1}, 
        {0,-1},   {-1,-1}  
    };
};
posted @ 2022-03-01 12:47  fwx  阅读(24)  评论(0)    收藏  举报