解题思路:这里的思路也是dfs,深度优先遍历
注意事项: 写在注释里了,但是感觉会重复多算一次本身的排列,如果可以的话,有无大佬再优化一下
参考代码:
#include<bits/stdc++.h>
using namespace std;
struct Plane{ //这里采用的结构体,默认都是public,如果采用class的话,下面那些int的位置要调整
int start_time,wait_time,lying_time;
Plane () =default; //这里是设置默认参数,避免后面声明vector的时候出现报错
Plane(int a,int b,int c){
this->start_time=a; //开始时间
this->wait_time=b; //盘旋时间
this->lying_time=c; //下降时间
}
};
bool dfs(vector<Plane> &plane,vector<bool> &bl,int pre ,int count){ //dfs的方法核心代码
if (count==plane.size()) return true; //代表全部匹配上了
for(int q=0;q<plane.size();q++) //第一层循环控制飞机安排顺序
{
if(!bl[q])
{
bl[q]=true; //重置飞机排列序号
if(pre<plane[q].start_time) //排列顺序第一架飞机出现的情况,且初始时间不为0
{
if(dfs(plane,bl,plane[q].start_time+plane[q].lying_time,count+1))
return true;
}
else if(pre<= plane[q].start_time+plane[q].wait_time){
if(dfs(plane,bl,pre+plane[q].lying_time,count+1)) //其他飞机的情况
return true;
}
bl[q]=false; //重置飞机排列序号
}
}
return false;
}
int main()
{
int T; //总共的组数
int N; //一组中的飞机架数
int st,wt,lt; //那三个输入的量
cin>>T;
for(int i=0;i<T;i++)
{
cin>>N;
vector<Plane> plane(N); //这里就是前文如果没有default会出现报错的问题了
vector<bool> bl(N,false);
int count=0;
int pre=0;
for(int j=0;j<N;j++)
{
cin>>st>>wt>>lt;
plane[j]=Plane(st,wt,lt); //已经知道序号,通过序号来,而不是push_back,时间效率会提升那么一点点
}
if(dfs(plane,bl,pre,count)) cout<<"YES";
else cout<<"NO";
cout<<endl;
}
}
0.0分
2 人评分
C二级辅导-阶乘数列 (C++代码)浏览:1931 |
不容易系列 (C语言代码)浏览:703 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:1763 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:645 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:590 |
C语言考试练习题_保留字母 (C语言代码)浏览:638 |
C语言训练-求矩阵的两对角线上的元素之和 (C语言代码)浏览:3472 |
printf基础练习2 (C语言代码)浏览:955 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:806 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:942 |