爆搜冥想
- 暴力枚举每一辆飞机
- 对于每一个飞机都只存在两种情况,可以降落和不可以降落
- 如果可以降落,计算降落后最早可以降落的时间
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++