DFS算法,有空写详解。
/*
N 架飞机准备降落到某个只有一条跑道的机场。
其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,
即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。
降落过程需要 Li个单位时间。一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,
但是不能在前一架飞机完成降落前开始降落。请你判断 N 架飞机是否可以全部安全降落。
*/
//#include <bits/stdc++.h>
#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
#include<cstring>
#define ll long long
#define endl '\n'
#define maxsize 20
using namespace std;
struct plane {
int t, d, l, time;
int flag = 0;
}p[maxsize];
int N;
// 本次判断有N个飞
//int str[maxsize] = {0};
// 用于存储已排好的序列
bool DFS(int s,int time) {
// 已经降落了s架飞机; 上一架飞机序号str(s-1),落地结束时间time
if (s >= N)
return true;
for (int i = 0; i < N; i++) {
// i是序号
if (p[i].flag) continue;
p[i].time = max(time, p[i].t);
// 开始降落时间
if (p[i].time > p[i].t + p[i].d) {
//cout << p[i].time <<" "<< p[i].t + p[i].d << endl;
//cout <<s<<"-"<<i<< "无法降落" << endl;
return false;
// continue;
}
else
{
p[i].flag = 1;
if (DFS(++s, p[i].time + p[i].l)) {
// 如果进入这里就是最后一个真true.
//cout << s << "-" << i << "可降落" << endl;
return true;
// end
}
s--; p[i].flag = 0;
// 如果走到这里就是上一次模拟的那一步无法降落,还原后,自然i++就好
}
}// 底层最后一个false
return false;
}
void solve() {
int T; cin >> T;
for (int i = 0; i < T; i++) {
cin >> N;
for (int j = 0; j < N; j++){
cin >> p[j].t >> p[j].d >> p[j].l;
p[j].flag = 0;
}
// 输入.j本身是输入时候的排序。
memset(str, 0, sizeof(str));
// 重置
if (DFS(0, 0))
cout << "YES" << endl;
else
cout << "NO" << endl;
}// end forT
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
文章讲述了使用深度优先搜索(DFS)算法解决N架飞机在有限油料和跑道条件下安全降落的问题,涉及时间窗口管理和动态规划思想。
4114






