#include<bits/stdc++.h>
using namespace std;
const int N=15;
struct point {//定义每个飞机结构体
int t;//到达时间
int d;//盘旋时间
int l;//降落时间
};
point a[N];//飞机数组
bool v[N];//状态数组
int k,n,times;
bool flag;
void dfs(int x,int times){
if(x==n){
flag=1;
return ;
}
for(int i=0;i<n;i++){//遍历每个飞机是否可以降落
if(v[i]==0 && a[i].t+a[i].d>=times) {//如果到达时间加盘旋时间可以大于上一个飞机完成降落的时间,就可以降落
v[i]=1;//降落
//定义一个新的参数,避免在递归过程中,修改原参数
int ttimes=max(a[i].t,times) + a[i].l;//这里的降落时间应该为前一个飞机完成降落的时间 和 后一个飞机到达的时间的最大值,加后一个飞机的降落时间,(如果后一个提前到了,那它的降落时间为前一个飞机完成降落的时间)
dfs(x+1,ttimes);//搜索,下一个飞机是否可以降落
v[i]=0; //回溯
}
}
}
int main(){
cin>>k;
while (k--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].t>>a[i].d>>a[i].l;
}
flag=0;//每次循环将flag重新归0
dfs(0,0);
if(flag==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
蓝桥:3511飞机降落(DFS)
最新推荐文章于 2024-07-23 17:36:37 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)