【真题解析】题目 3151: 蓝桥杯2023年第十四届省赛真题-飞机降落【C++ DFS 超详解注释版本】

爆搜冥想

  • 暴力枚举每一辆飞机
  • 对于每一个飞机都只存在两种情况,可以降落和不可以降落
  • 如果可以降落,计算降落后最早可以降落的时间pre,作为下一次递归的传参
  • 如果不可以降落,枚举下一辆飞机

注意这辆的降落有盘旋这种量子叠加态!

说人话就是:

  • 降落时有两种情况,一种是开始降落时间比pre后,那么从这个降落时间开始往后计算进行下一次递归即可。
  • 还有一种就是,在盘旋的状态中可以降落,那么就直接用pre计算下一次最早降落的时间,也就是结束盘旋状态立即降落。

核心出装

c 复制代码
//plane.st:最早开始时间	plane.con:可持续时间 plane.netm:落地需要的时间 
bool dfs(vector<plane> &v,vector<bool> &bl,int pre,int count){			//pre和count默认是为0的 
    if(count==v.size()) return true;									//如果搜索了全部的飞机,函数返回true             
    for(int i=0;i<v.size();i++){										//遍历数组中所有飞机                
        if(bl[i] == false){												//如果找到一架飞机没有降落就使它降落 
            bl[i] = true;												//将该飞机的状态设置为已经降落 
            if(pre < v[i].st){											//如果这辆斐济满足降落条件 
                if(dfs(v, bl, v[i].st+v[i].netm, count+1)) return true;	//继续搜索这辆飞机降落后的时间,如果满足返回true 
            }else if(pre <= v[i].st+v[i].con){							//如果这辆飞机盘旋后可以满足降落条件 
                if(dfs(v, bl, pre+v[i].netm, count+1)) return true;		//让这一架飞机立即降落,搜索它降落后的情况,满足返回true 
            }
            bl[i] = false;												//如果不满足降落条件,将这辆飞机的状态恢复成false 
        }
    }
    return false;														//搜索结束找不到返回false 
}

返回泉水

c 复制代码
// 蓝桥真题-飞机降落 
#include<bits/stdc++.h>
using namespace std;
class plane{
public:
    int st;//最早开始时间 
    int con;//可持续费的时间 
    int netm;//落地需要的时间  
    plane(int s,int c,int ne){
        st=s;
        con=c;
        netm=ne;
    } 
};
//plane.st:最早开始时间	plane.con:可持续时间 plane.netm:落地需要的时间 
bool dfs(vector<plane> &v,vector<bool> &bl,int pre,int count){			//pre和count默认是为0的 
    if(count==v.size()) return true;									//如果搜索了全部的飞机,函数返回true             
    for(int i=0;i<v.size();i++){										//遍历数组中所有飞机                
        if(bl[i] == false){												//如果找到一架飞机没有降落就使它降落 
            bl[i] = true;												//将该飞机的状态设置为已经降落 
            if(pre < v[i].st){											//如果这辆斐济满足降落条件 
                if(dfs(v, bl, v[i].st+v[i].netm, count+1)) return true;	//继续搜索这辆飞机降落后的时间,如果满足返回true 
            }else if(pre <= v[i].st+v[i].con){							//如果这辆飞机盘旋后可以满足降落条件 
                if(dfs(v, bl, pre+v[i].netm, count+1)) return true;		//让这一架飞机立即降落,搜索它降落后的情况,满足返回true 
            }
            bl[i] = false;												//如果不满足降落条件,将这辆飞机的状态恢复成false 
        }
    }
    return false;														//搜索结束找不到返回false 
}
int main(){
    int t;
    cin>>t;						//输入测试数据总数 
    while(t--){					//执行对应次数 
        int n;					//输入飞机数量 
        cin>>n;
        vector<plane> v;		//初始化动态数组存放飞机 
        vector<bool> bl(n,false);	//每一辆飞机的状态初始化为false 
        while(n--){				//输入每一架飞机的信息 
            int t,d,l;			 
            cin>>t>>d>>l;
            v.push_back(plane(t,d,l));		//将该飞机推入动态数组 
        }
        if(dfs(v,bl,0,0)) cout<<"YES"<<endl;	//如果搜索到一种情况能使得飞机们降落返回true 
        else cout<<"NO"<<endl;					//否则返回false 
    }
    return 0;
}

结语🤣

这一次blog尝试了比较抽象的标题,这里进行解读:

  • 爆搜冥想:即核心思想,思路过程。
  • 核心出装:即完成功能的主要实现函数,dfs函数。
  • 返回泉水:即所有代码的一览。

编译环境

C++ 11 && DevC++

相关推荐
get_money_18 分钟前
代码随想录Day52 101. 孤岛的总面积,102. 沉没孤岛,103. 水流问题,104.建造最大岛屿。
java·开发语言·笔记·算法·深度优先·图论
一代...24 分钟前
【C++】string的模拟实现
开发语言·c++
c++初学者ABC40 分钟前
【基础】卒的遍历(DFS)
c++·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码
c语言·c++·考研·数据结构与算法·树和森林
Bucai_不才3 小时前
【C++】初识C++之C语言加入光荣的进化(下)
c语言·c++·面向对象编程
A懿轩A3 小时前
C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码
c语言·c++·学习·算法·哈夫曼树·王卓
w_outlier3 小时前
cookie__HTTPS
c++·网络协议·http·https
编码小哥4 小时前
C++线程同步和互斥
开发语言·c++
打鱼又晒网5 小时前
Linux网络 | 网络计算器客户端实现与Json的安装以及使用
linux·c++·网络协议·计算机网络
DARLING Zero two♡6 小时前
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
java·开发语言·数据结构·c++·算法