查看: 406| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 1293 障碍物的最短路径

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
请看经典题型。

class Solution {



    public:


vector<vector<int>> dir={{1,0},{-1,0},{0,-1},{0,1}};
    int shortestPath(vector<vector<int>>& grid, int k) {
int row=grid.size();
int col=grid[0].size();

priority_queue<vector<int>, vector<vector<int>>, greater<>> pq;
//node first=node({0,0,0,k});
k=min(k,row+col-3);
vector<int> first={0,0,0,k};
pq.push(first);

while(!pq.empty())
{
    vector<int> start=pq.top();
    pq.pop();

    if(start[1]==row-1&&start[2]==col-1)
    return start[0];

int k=start[3];
    for(int k=0;k<4;k++)
    {
        int i=start[1]+dir[k][0];
        int j=start[2]+dir[k][1];

if(i>=0&&i<row&&j>=0&&j<col)
{
    if(grid[i][j]==0)
    {
        pq.push({start[0]+1, i, j, start[3]});
    }

    else
    {
        if(start[3]>=1)
        pq.push({start[0]+1,i,j,start[3]-1});
    }
}



    }
}


return -1;


    }
};

用了广度遍历和贪心。结果超时。

没有超时的算法,也是广度遍历,
琢磨一下午没琢磨出来,是哪里超时了。。。
struct State {
    int x, y;
    int r;
    State(int x_, int y_, int r_) {
        x = x_;
        y = y_;
        r = r_;
    }
};

class Solution {
    int dx[4] = {1, 0, -1, 0};
    int dy[4] = {0, 1, 0, -1};
public:
    int shortestPath(vector<vector<int>>& g, int k) {
        int m = g.size(), n = g[0].size();
        if(k >= m + n - 3) return m + n - 2;
        vector<vector<vector<bool>>> visited(m, vector<vector<bool>>(n, vector<bool>(k + 1, 0)));
        queue<State> Q;
        Q.emplace(0, 0, k);
        int step = 0;
        while(!Q.empty()) {
            int s = Q.size();
            while(s--) {
                auto p = Q.front();
                Q.pop();
                int x = p.x, y = p.y;
                int r = p.r;
                if(x == m - 1 && y == n - 1 && r >= 0) return step;
                if(visited[x][y][r] == 1) continue;
                visited[x][y][r] = 1;
                for(int k = 0; k < 4; k++) {
                    if(x + dx[k] >= 0 && x + dx[k] < m && y + dy[k] >= 0 && y + dy[k] < n) {
                        if(g[x + dx[k]][y + dy[k]] == 1 && r >= 1) Q.emplace(x + dx[k], y + dy[k], r - 1);
                        else if(g[x + dx[k]][y + dy[k]] == 0)
                            Q.emplace(x + dx[k], y + dy[k], r);
                    }
                }
            }
            step++;
        }
        return -1;
    }
};


所以, 问题出在哪里?

评分

参与人数 1大米 +1 收起 理由
14417335 + 1 给你点个赞!

查看全部评分


上一篇:刷题刷题刷题
下一篇:智商欠费,死活想不出来
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表