栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【力扣·每日一题】1036. 逃离大迷宫 (C++ bfs 思维)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【力扣·每日一题】1036. 逃离大迷宫 (C++ bfs 思维)

linkkk

题意


思路

常规最短路可以通过bfs解决,但是这个图的范围为 1 e 6 ∗ 1 e 6 1e6*1e6 1e6∗1e6,bfs的复杂度为 O ( 1 e 12 ) O(1e12) O(1e12),会超时。
障碍的大小只有200个,从障碍入手考虑起点终点无法到达的情况就是起点被障碍包围或终点被障碍包围。
障碍斜着放包围的格子最多,为 n ∗ ( n − 1 ) / 2 n*(n-1)/2 n∗(n−1)/2个
所以如果从起点出发,经过的格子数大于这个的话说明起点没有被障碍包围。同理,终点也这样。
如果在过程中,就已经到达终点的话,那肯定也是可以的。
其余情况就说明了起点或终点被障碍包围了,为 f a l s e false false

代码
class Solution {
public:
    int nx[4]={0,0,1,-1};
    int ny[4]={1,-1,0,0};
    map,int>mp;
    int sum=0;
    bool isEscapePossible(vector>& blocked, vector& source, vector& target) {
        int x=blocked.size();
        for(int i=0;i,int>vis;
        int ans=0;
        queue>q;
        q.push({sx,sy});
        vis[{sx,sy}]=1;
        while(!q.empty()){
            ans++;
            pair now=q.front();q.pop();
            if(now.first==ex&&now.second==ey){
               // printf("(%d,%d)=>(%d,%d)n",sx,sy,ex,ey);
                return true;
            }
            if(ans>sum){
              //  cout<
                return true;  
            }
            int x=now.first,y=now.second;
            for(int i=0;i<4;i++){
                int xx=x+nx[i],yy=y+ny[i];
                if(xx>=0&&xx<1000000&&yy>=0&&yy<1000000){
                    if(!mp.count({xx,yy})&&!vis.count({xx,yy})) vis[{xx,yy}]=1,q.push({xx,yy});
                } 
            }
        }
        return false;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703005.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号