package com.lqb;
import java.util.Arrays;
import java.util.Scanner;
/*思路:
* 定义全局变量
* 定义飞机对象 循环对每一组的飞机对象进行赋值
* 对输入的值进行存储
* 定义标记数组 方案可行 true 默认false
* 方法dfs(0,0) 深度查询 在本文使用的是check(0,0)
* 第一个表示第几个飞机 第二个参数表示上一架飞机的落地时间*/
public class 飞机降落答案2 {
static int N = 11, n;
//定义每一组数据的飞机对象
static class Plain {
int t, d, l;
public Plain(int t, int d, int l) {
this.t = t;
this.d = d;
this.l = l;
}
}
//每一组最多是11个plain对象
static Plain[] plains = new Plain[N];//
static boolean[] flag = new boolean[N];//对每一组的每个飞机进行标记 true表示当前飞机可以起飞 初始状态都是没有起飞 不可以起飞
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();//T表示有几组数据
while (T-- != 0) {//一组数据一组数据来
Arrays.fill(flag, false);//每一组开始就把每一个飞机的起飞情况标记为没有起飞 方便后期深度排查确定方案
n = sc.nextInt();//表示每一组数据里边有多少个飞机
for (int i = 0; i < n; i++) {//对于每一组数=数据的每个飞机参数进行赋值
int t = sc.nextInt();
int d = sc.nextInt();
int l = sc.nextInt();
plains[i] = new Plain(t, d, l);
}
if (check(0, 0)) {//从第一架飞机开始进行dfs 第一架飞机的时间最早是0
System.out.println("YES");
} else System.out.println("NO");
}
}
//这里传的是u 是变量 表示第u架飞机 不是n n是常量
public static Boolean check(int u, int time) {
//递归的出口
//每个飞机都能完成衔接成功起飞 就输出true
if (u == n)
return true;
//刚开始都是未起飞状态 所以这里是从第一架未起飞的飞机开始的
for (int i = 0; i < n; i++) {
if (!flag[i])//从没有起飞的第i架飞机进行递归
{
int t = plains[i].t;
int d = plains[i].d;
int l = plains[i].l;
if (t + d >= time) {//满足起飞条件就可以起飞
flag[i] = true;//第i架飞机做个起飞标记
//这里使用的是u+1来表示下一架飞机 下一架飞机的起飞时间是上一辆飞机的落地时间:落地时间=起飞时间(上一架飞机的到来时间和上上架飞机的离开时间的最大值)+l(在空中的时间)
if (check(u + 1, Math.max(t, time) + l))
return true;
flag[i] = false;
}
}
}
return false;
}
}
蓝桥杯 java 飞机降落
于 2024-04-02 16:04:45 首次发布
该篇文章介绍了一个Java程序,使用深度优先搜索(DFS)算法解决飞机降落问题。通过定义飞机对象和标记数组,判断飞机能否按照给定的时间顺序安全降落。

549

被折叠的 条评论
为什么被折叠?



