【力扣·每日一题】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;
    }
};
/*
*/
目录
相关文章
|
30天前
|
存储 Linux 编译器
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
50 0
|
1月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
1月前
|
C++
两种解法解决 LeetCode 27. 移除元素【C++】
两种解法解决 LeetCode 27. 移除元素【C++】
|
7天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
存储 编译器 Linux
13 0
|
1月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
30 8
|
2月前
【Leetcode 2583】二叉树中的第K大层和 —— 优先队列 + BFS
解题思路: - 使用队列保存节点,按层序依次保存该层节点 - 使用优先队列保存每层节点值的总和,最后剔除前k个大数即可得到
|
3月前
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
41 0
力扣 C++|一题多解之动态规划专题(1)
|
21天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
21天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
30 0