蓝桥杯-飞机降落-DFS

本文讨论了如何通过深度优先搜索(DFS)解决飞机降落顺序问题,确保合法方案的存在。通过枚举所有可能的降落顺序并检查时间限制,文章提供了代码实现和逻辑分析。
摘要由CSDN通过智能技术生成
1.题目解析
2.算法原理

对于求方案数,判断方案是否合法,且题目的数量级不是很大时,我们优先考虑暴力枚举(DFS)

枚举出所有方案,判断其是否合法,进而找出题目答案

本题中就是安排飞机的降落顺序,枚举全排列方案。

我们可以从中间状态考虑,当枚举到第i架飞机时,考虑第i-1架飞机降落所消耗的时间time

如果time大于Ti+Di 则该方案不合法,反之合法

所以在设计dfs函数时,只需传入枚举位置和time即可

3.代码实现
#include<iostream>
using namespace std;
const int N = 1e5;
int T, n;
bool st[N]//st数组记录该飞机是否被枚举
struct plane//用结构体储存飞机信息
{
	int t, d, l;
}p[N];

bool dfs(int u, int time)//u表示枚举位数,time 表示前一次飞机降落所需的时间
{
	if (u == n)return true;
	for (int i = 0; i < n; i++)//
	{
		if (!st[i])
		{
			
			if (time > p[i].t + p[i].d)//如果前一架飞机降落所需的时间大于当前飞机的停靠时间
			{                          //该方案不合法,返回上一层
				return false;
			}
			int t = max(time, p[i].t) + p[i].l;//当前层所需的时间
            st[i] = true;//已经枚举过了标记为true
			if (dfs(u + 1, t))//如果枚举出的方案合法返回true
				return true;
			st[i] = false;//如果枚举出的方案不合法,回溯,将st数组标记为false
		}
	}
	return false;//当枚举出所有方案后,没有合法的方案,返回flase
}

int main()
{
	cin >> T;
	while (T--)
	{
		cin >> n;
		for (int i = 0; i < n; i++)
		{
			cin >> p[i].t >> p[i].d >> p[i].l;
			st[i] = false;//
		}

		if (dfs(0, 0))
			cout << "YES" << endl;
		else cout << "NO" << endl;
	}


	return 0;
}
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值