这是一道经典的dfs的题目,这道题主要和排列数字那题的区别是它可能中途循环到尾都找不到合适的条件,所以需要if(dfs(u,start)) return1;来判断他在下一层找没找到合适的飞机进行降落。
飞机降落,具体代码如下
#include<iostream>
#include<algorithm>
using namespace std;
const int N=11;
struct plane{
int t,d,l;
}a[N];
int m,n;
int st[N];
int dfs(int u,int last)
{
if(u==n)
return 1;
for(int i=0;i<n;i++)
{
if(!st[i]&&((a[i].t>=last)||(a[i].t+a[i].d>=last)))
{
st[i]=1;
int w=max(a[i].t,last)+a[i].l;
if(dfs(u+1,w)) return 1;
st[i]=0;
}
}
return 0;
}
int main()
{
cin>>m;
while(m--)
{
cin>>n;
memset(st,0,sizeof st);
for(int i=0;i<n;i++)
{
cin>>a[i].t>>a[i].d>>a[i].l;
}
int k=dfs(0,0);
if(k) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}