DFS飞机降落

问题描述

NN 架飞机准备降落到某个只有一条跑道的机场。其中第 ii 架飞机在 TiTi​ 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 DiDi​ 个单位时间,即它最早可以于 TiTi​ 时刻开始降落,最晚可以于 Ti+DiTi​+Di​ 时刻开始降落。降落过程需要 LiLi​ 个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。

请你判断 NN 架飞机是否可以全部安全降落。

输入格式

输入包含多组数据。

第一行包含一个整数 TT,代表测试数据的组数。

对于每组数据,第一行包含一个整数 NN。

以下 NN 行,每行包含三个整数:TiTi​,DiDi​ 和 LiLi​。

输出格式

对于每组数据,输出 YESYES 或者 NONO,代表是否可以全部安全降落。

代码

复制代码
递归调用 dfs 函数,处理下一个元素,更新 last 为 max(p[i].t, last) + p[i].l

如果递归调用返回 false,说明当前选择不可行,将元素 i 标记为未访问
            st[i] = false;
复制代码
#include<bits/stdc++.h>
using namespace std;

#define int long long

const int N = 14;
int n;

struct Plane
{
	int t, d, l;
}p[N];

 
bool st[N];

bool dfs(int u, int last){
  if(u == n) return true;

  for(int i = 0; i < n; i ++ ) {
    if(!st[i] && p[i].t+p[i].d >= last) {
      st[i] = true;

      if(dfs(u+1, max(p[i].t, last)+p[i].l)) return true;
    
      st[i] = false;
    }
  }


  return false;
}

signed 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;
      }
		
		memset(st,0,sizeof(st));

		if(dfs(0,0)) cout << "YES"<<endl;
		else cout << "NO" << endl;
    
  }
	
    return 0;
}
相关推荐
To_OC6 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495647 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒11 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽13 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米13 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠14 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA16 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel16 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客16 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化