蓝桥杯 java 飞机降落

该篇文章介绍了一个Java程序,使用深度优先搜索(DFS)算法解决飞机降落问题。通过定义飞机对象和标记数组,判断飞机能否按照给定的时间顺序安全降落。
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;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值