【真题解析】题目 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++

相关推荐
阿豪只会阿巴1 小时前
【多喝热水系列】从零开始的ROS2之旅——Day4
c++·笔记·python·ros2
郭涤生2 小时前
fmtlib/fmt仓库熟悉
c++
Stanford_11062 小时前
【2026新年启程】学习之路,探索之路,技术之路,成长之路……都与你同行!!!
前端·c++·学习·微信小程序·排序算法·微信开放平台
郝学胜-神的一滴2 小时前
Linux线程属性设置分离技术详解
linux·服务器·数据结构·c++·程序人生·算法
w-w0w-w3 小时前
C++构造函数初始化列表全解析
c++
梵尔纳多3 小时前
初识 OpenGL
c++·图形渲染
王老师青少年编程3 小时前
2025年12月GESP(C++二级): 黄金格
c++·算法·gesp·csp·信奥赛·二级·黄金格
一起搞IT吧3 小时前
相机Camera日志实例分析之十二:相机Camx【萌拍后置zoom拍照】单帧流程日志详解
android·c++·数码相机·智能手机
十五年专注C++开发3 小时前
浅谈Qt中的QSql模块整体设计
开发语言·数据库·c++·qt
k***92163 小时前
C++:继承
java·数据库·c++