蓝桥杯快到了,一个小白的蓝桥杯备战,分享一下飞机降落dfs,附上代码详细解释
,如果有不正确,请大佬们提出,如果有更好的方法,欢迎指出
#include<iostream>
#include<algorithm>
using namespace std;
const int N=20;
bool used[N];//用来标记
int n;
struct plane
{
int t;
int d;
int l;
}p[N];//使用结构体
int dfs(int u,int time)//前一架飞机落地时间
{
if(u>=n)
return true;
//考虑谁先降落
for(int i=0;i<n;i++)
{
if(!used[i])//未被标记
{
used[i]=true;//开始用了,立马标记
if(p[i].t+p[i].d<time)//如果他最晚降落时间都比不上前一架飞机降落时间
{
used[i]=false;//回溯到dfs之前的转态 ,另一个方案这个还没开始使用
return false;//方案不合法
}
int t=max(p[i].t,time)+p[i].l;//找最大值,开始降落的准备时间加上 降落的时间
if(dfs(u+1,t))
return true;//后续方案合法
used[i]=false;//回溯才标记为false,为了防止重复
}
}
return false;//如果所有方案都不合法
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i].t>>p[i].d>>p[i].l;//输入
if(dfs(0,0))
cout<<"YES"<<endl;//返回true,存在合法方案
else
cout<<"NO"<<endl;
for(int i = 0; i < n; i ++)
used[i] = false;
}
return 0;
}