飞机降落dfs

蓝桥杯快到了,一个小白的蓝桥杯备战,分享一下飞机降落dfs,附上代码详细解释

,如果有不正确,请大佬们提出,如果有更好的方法,欢迎指出



​
#include<iostream>
#include<algorithm>
using namespace std;
const int N=20;
bool used[N];//用来标记 
int n; 
struct plane
{
	int t;
	int d;
	int l;
}p[N];//使用结构体 
int dfs(int u,int time)//前一架飞机落地时间 
{
	if(u>=n)
	return true;
	//考虑谁先降落
	for(int i=0;i<n;i++)
	{
		if(!used[i])//未被标记
		{
		used[i]=true;//开始用了,立马标记
		if(p[i].t+p[i].d<time)//如果他最晚降落时间都比不上前一架飞机降落时间
		{ 
		used[i]=false;//回溯到dfs之前的转态 ,另一个方案这个还没开始使用 
		return false;//方案不合法 
	    }
		
		int t=max(p[i].t,time)+p[i].l;//找最大值,开始降落的准备时间加上 降落的时间 
		if(dfs(u+1,t)) 
		return true;//后续方案合法 
		used[i]=false;//回溯才标记为false,为了防止重复 
}
}
return false;//如果所有方案都不合法 
}
int 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;//输入 
	if(dfs(0,0))
	cout<<"YES"<<endl;//返回true,存在合法方案 
	else
	cout<<"NO"<<endl; 
	for(int i = 0; i < n; i ++)
	   used[i] = false;
}
return 0;
}

​

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何舟yancy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值