【力扣·每日一题】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;
    }
};
/*
*/
目录
相关文章
|
8月前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
46 0
|
4月前
|
存储 安全 程序员
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
【C++篇】深入内存迷宫:C/C++ 高效内存管理全揭秘
135 3
|
9月前
|
算法 C语言 容器
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(下)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
73 7
|
9月前
|
存储 算法 C语言
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
83 5
|
9月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(下)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
57 1
|
9月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(中)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
54 1
|
9月前
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
73 1
|
25天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
64 19
|
25天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
45 13
|
25天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
47 5