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

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

linkkk

题意

20200401134307494.png20200401134307494.png

思路

常规最短路可以通过bfs解决,但是这个图的范围为1 e 6 ∗ 1 e 6,bfs的复杂度为O ( 1 e 12 ),会超时。

障碍的大小只有200个,从障碍入手考虑起点终点无法到达的情况就是起点被障碍包围或终点被障碍包围。

障碍斜着放包围的格子最多,为n ∗ ( n − 1 ) / 2个

所以如果从起点出发,经过的格子数大于这个的话说明起点没有被障碍包围。同理,终点也这样。

如果在过程中,就已经到达终点的话,那肯定也是可以的。

其余情况就说明了起点或终点被障碍包围了,为f a l s e

代码

class Solution {
public:
    int nx[4]={0,0,1,-1};
    int ny[4]={1,-1,0,0};
    map<pair<int,int>,int>mp;
    int sum=0;
    bool isEscapePossible(vector<vector<int>>& blocked, vector<int>& source, vector<int>& target) {
        int x=blocked.size();
        for(int i=0;i<x;i++) 
            mp[{blocked[i][0],blocked[i][1]}]=1;
        sum=(x)*(x-1)/2;
        if(bfs(source[0],source[1],target[0],target[1])&&bfs(target[0],target[1],source[0],source[1])) return true;
        return false;
    }
    bool bfs(int sx,int sy,int ex,int ey){
        map<pair<int,int>,int>vis;
        int ans=0;
        queue<pair<int,int>>q;
        q.push({sx,sy});
        vis[{sx,sy}]=1;
        while(!q.empty()){
            ans++;
            pair<int,int> 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<<ans<<"==="<<sum<<endl;
                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;
    }
};
/*
*/
目录
相关文章
|
9月前
|
分布式计算 算法 Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本文讲解了两道经典的图论问题:**岛屿数量(LeetCode 200)** 和 **腐烂的橘子(LeetCode 994)**,分别通过 DFS/BFS 实现。在“岛屿数量”中,利用深度或广度优先搜索遍历二维网格,标记连通陆地并计数;“腐烂的橘子”则采用多源 BFS,模拟腐烂传播过程,计算最短时间。两者均需掌握访问标记技巧,是学习网格搜索算法的绝佳实践。
424 1
|
9月前
|
Java C++
力扣第一道困难题《3. 无重复字符的最长子串》,c++
首先我们看到这个题是肯定有一种暴力的硬解思路的,那就是将两个vector直接链接起来,然后再排序后,直接返回中间值,这个方法实现起来还是非常容易的,
324 0
|
9月前
|
Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本篇博客详细解析了三道经典的动态规划问题:198. 打家劫舍(线性状态转移)、279. 完全平方数与322. 零钱兑换(完全背包问题)。通过 Go 语言实现,帮助读者掌握动态规划的核心思想及其实战技巧。从状态定义到转移方程,逐步剖析每道题的解法,并总结其异同点,助力解决更复杂的 DP 问题。适合初学者深入理解动态规划的应用场景和优化方法。
301 0
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
148 0
|
存储 安全 程序员
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
925 3
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
存储 算法 C语言
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
324 5
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
存储 算法 数据可视化
广度优先搜索(BFS)+回溯解决LeetCode 126题:单词接龙 II
广度优先搜索(BFS)+回溯解决LeetCode 126题:单词接龙 II