本文主要是介绍【真题解析】题目 3151: 蓝桥杯2023年第十四届省赛真题-飞机降落【C++ DFS 超详解注释版本】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
爆搜冥想
- 暴力枚举每一辆飞机
- 对于每一个飞机都只存在两种情况,可以降落和不可以降落
- 如果可以降落,计算降落后最早可以降落的时间
pre
,作为下一次递归的传参 - 如果不可以降落,枚举下一辆飞机
注意这辆的降落有盘旋这种量子叠加态!
说人话就是:
- 降落时有两种情况,一种是开始降落时间比pre后,那么从这个降落时间开始往后计算进行下一次递归即可。
- 还有一种就是,在盘旋的状态中可以降落,那么就直接用pre计算下一次最早降落的时间,也就是结束盘旋状态立即降落。
核心出装
//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
}
返回泉水
// 蓝桥真题-飞机降落
#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++
这篇关于【真题解析】题目 3151: 蓝桥杯2023年第十四届省赛真题-飞机降落【C++ DFS 超详解注释版本】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!