leetcode 5286 網格中的最短路徑


給你一個 m * n 的網格,其中每個單元格不是 0(空)就是 1(障礙物)。每一步,您都可以在空白單元格中上、下、左、右移動。

如果您 最多 可以消除 k 個障礙物,請找出從左上角 (0, 0) 到右下角 (m-1, n-1) 的最短路徑,並返回通過該路徑所需的步數。如果找不到這樣的路徑,則返回 -1。

解題思路是BFS,每遇到一個障礙物,就看當前還有沒有機會越過障礙物。第一次寫的時候沒有考慮到每個格子的狀態其實不僅僅是一個的,因為達到當前格子走過的障礙物數目是不同的,所以vis要增加一維保存

走到當前格子,總共經過多少個障礙物了。其次格子的狀態數目是有限制的,最多是n*m,注意這一條件,不然死循環了。

最后代碼如下:

class Solution {
public:
    struct T{
        int x,y;
        int step;
        int k;
    };
    queue<T>q;
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,1,-1};
    bool vis[41][41][41*41];
    int bfs(vector<vector<int>>& grid,int m,int n,int k)
    {
        memset(vis,0,sizeof(vis));
        T init;
        init.x=0;init.y=0;
        init.step=0;init.k=0;
        vis[0][0][0]=1;
        q.push(init);
        while(!q.empty())
        {
            T tmp=q.front();
            if(tmp.x==m-1&&tmp.y==n-1)
                return tmp.step;
            q.pop();
            for(int i=0;i<4;i++)
            {
                int xx=tmp.x+dx[i];
                int yy=tmp.y+dy[i];
                if(xx>=0&&xx<m&&yy>=0&&yy<n)
                {
                    if(grid[xx][yy]==1&&tmp.k+1<=k&&!vis[xx][yy][tmp.k+1]&&tmp.k+1<=n*m)
                    {
                        //cout<<"ww: "<<xx<<" "<<yy<<" "<<tmp.k+1<<endl;
                        vis[xx][yy][tmp.k+1]=1;
                        T tp;
                        tp.k=tmp.k+1;
                        tp.step=tmp.step+1;
                        tp.x=xx;
                        tp.y=yy;
                        q.push(tp);
                    }
                    else if(grid[xx][yy]==0&&tmp.k<=n*m&&!vis[xx][yy][tmp.k])
                    {
                        vis[xx][yy][tmp.k]=1;
                        T tp;
                        tp.k=tmp.k;
                        tp.step=tmp.step+1;
                        tp.x=xx;
                        tp.y=yy;
                        q.push(tp);
                    }
                }
            }
        }
        return -1;
    }
    int shortestPath(vector<vector<int>>& grid, int k) {
        int m=grid.size();
        int n=grid[0].size();
        return bfs(grid,m,n,k);
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM