蓝桥杯2023A组真题-飞机降落

文章讲述了使用深度优先搜索(DFS)算法解决N架飞机在有限油料和跑道条件下安全降落的问题,涉及时间窗口管理和动态规划思想。

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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值