递归将所有飞机下降顺序全排列,只要有其中一个排列顺序满足条件即可,能力有限,写的很冗杂
递归用到了回溯法,可参考全排列的回溯方式
#include<bits/stdc++.h>
using namespace std;
int sg[100005]={0},plan[15]={0},ant=0;
int t,t1;
struct stu{
int s,d,l;
}p[100005];
struct stu1{
int s,d,l;
}p1[100005];
void dfs(stu p[],int index,int n,int t){
if(index==n){
ant=0;
int sum=p[0].l;
int sg1[15]={0};//记录飞机是否降落成功
sg1[0]=1;
for(int i=0;i<n-1;i++){
if(sg1[i]==1&&sum<=p1[i+1].s+p1[i+1].d){
if(p1[i+1].s>sum){//判断即将下降的飞机到达时间和前面所有飞机下降过程所花时间
sum=sum+p1[i+1].l+(p1[i+1].s-sum);
sg1[i+1]=1;
ant++;
}
else{
sum=sum+p1[i+1].l;
sg1[i+1]=1;
ant++;//记录多少飞机成功 降落的
}
}
else break;
}
if(ant==n-1){//第一架飞机一定能降落,所以-1
plan[t]=1;
}
return ;
}
for(int i=0;i<n;i++){
if(!sg[i]){
sg[i]=1;
p1[index].s=p[i].s;
p1[index].d=p[i].d;
p1[index].l=p[i].l;
dfs(p,index+1,n,t);
sg[i]=0;//回溯
}
}
}
int main()
{
int n;
cin>>t;
t1=t;
while(t){
cin>>n;
for(int i=0;i<n;i++){
cin>>p[i].s>>p[i].d>>p[i].l;
}
dfs(p,0,n,t);
t--;
}
for(int i=t1;i>=1;i--){
if(plan[i]==1){
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}
return 0;
}
数的全排列
将1,2,3,4进行全排列
#include<bits/stdc++.h>
using namespace std;
int sigal[4]={0};
int a[4];
void dfs(int num[],int n){
if(n==4){
for(int i=0;i<4;i++){
cout<<a[i];
}
cout<<endl;
return ;
}
for(int i=0;i<4;i++){
if(!sigal[i]){
sigal[i]=1;
a[n]=num[i];
// cout<<a[n];
dfs(num,n+1);
sigal[i]=0;
}
}
}
int main()
{
int num[]={1,2,3,4};
dfs(num,0);
return 0;
}