第十四届蓝桥杯B组c/c++第四题飞机降落dfs

文章介绍了如何使用深度优先搜索(DFS)解决飞机降落问题,强调了数据范围小对算法选择的重要性,并提供了代码示例,同时提到了代码优化以提高运行效率,特别是关注时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

        题意概括:一共有T组数据,每组数据有n架飞机,每架飞机都有到达时间t,可以盘旋的时间d,降落所需要的时间l。要求在此架飞机降落完成后下一架飞机才可以开始降落,求每组数据的n架飞机是否都可以全部安全降落。

         教给~~朋友们一个小技巧=====》每次读完题之后要看一下数据范围,可以更好的帮助我们判断使用何种方法去解这道题。比如,朋友们做题的时候老超时就是这个原因,这时候咱就要去优化我们的算法去解决这道问题,降低代码的时间复杂度和空间复杂度

        回到这题目上,打眼一看,数据范围很小。一般情况下,不是dfs就是bfs。深度优先搜索和广度优先搜索,不知道的朋友们可以先去了解一下dfs和bfs,这是我之前看过的,写的很好。飞机降落这道题就是一道dfs。我的代码里面已经有很详细的注释了,大家自己看一下,看完之后试试可不可以自己做出来,后面再回来复习一下。

        解题思路:数据范围较小,切经过上面的分析。我们就可以很明确的去使用dfs来枚举每架飞机的降落,若是存在每架飞机都可以降落的情况就返回true,若是枚举完都没有这种情况就返回flase

代码后面的注释稍微有点繁琐,但是可以很好的帮助初学者去理解,希望可以帮助到大家

#include<iostream>//头文件 
#include<cstring>//使用memset初始化
#include<vector>//动态数组 
#include<cmath>//使用std::min和std::max 
#define int long long //个人习惯,经常性忘记看数据范围,每次都宏定义好后面直接可以用 int 
#define endl "\n"//换行更快一点 
#define ios std::ios::sync_with_stdio(0),std::cin.tie(0),std::cout.tie(0)//给程序提速
//using namespace std;  命名空间    做大型程序的话建议不用命名空间,和我一样每次使用std::更好一点 
typedef struct plane{//建一个飞机结构体 
	int t;// 到达时间 
	int d;// 到达之后最多的盘旋时间 
	int l;// 降落所需时间 
}feiji;//重命名 
std::vector<feiji>lp(15);//建一个数组,题目n<=10,稍微开大一点开到15 
int v[15];//看某架飞机是否已经完成降落  0:还未降落  1:已经降落 
//也可以用bool   已经降落用true  未降落用false 
bool flag;//看是否全部的飞机降落完毕 
//返回值为空 
void dfs(int n,int x,int shijian)//(飞机个数,一降落的飞机个数,x架飞机降落所用时间) 
{
	if(n==x)//若是已降落飞机个数==飞机总数 
	{
		flag=true;//给flag赋值true,并返回 
		return;
	}
	for(int i=0;i<n;i++)
	{//从第一架飞机向后遍历,若是还未降落&&到达时间>=前面已经使用的时间 
		if(v[i]==0&&lp[i].t+lp[i].d>=shijian) 
		{
			v[i]=1;//将这架飞机标记为已经降落 
			dfs(n,x+1,std::max(shijian,lp[i].t)+lp[i].l);//飞机总架数不变,已经降落架数加一,后面这个仔细考虑一下 
			v[i]=0;//回溯  重新将这架飞机标记为未降落 
		}
	}
}
void solve()
{
	int t;std::cin>>t;//t组数据 
	while(t--)
	{
		int n;std::cin>>n;//n架飞机 
		memset(v,0,sizeof(v));//使用memset初始化  (数组首地址,改变后的值,数组大小) 
		flag=false;//初始化为false  表示飞机还没有全部降落 
		for(int i=0;i<n;i++)//输入n架飞机的数据 
		std::cin>>lp[i].t>>lp[i].d>>lp[i].l;
		dfs(n,0,0);//调用dfs函数 
		if(flag==true)std::cout<<"YES"<<endl;
		else std::cout<<"NO"<<endl;
	}
}
signed main()//已经宏定义了int查找替换为long long,所以用signed 
{
	ios;//已经宏定义好的 
	solve();//将程序全部写在函数中,更方便我们找出错误 
	return 0;//蓝桥杯规则返回值必须为零 小伙伴们不要忘记 
}

下面是我自己每次做题时候用的,做题之前打好,做题直接复制粘贴就ok,把自己的程序写在solve函数里面。具体问题具体分析,比如我们要用memset()来给数组初始化就再加上它的头文件#include<cstring>  ,需要使用vector建一个动态数组就加上#include<vector>......

#include<iostream>
#define int long long 
#define endl "\n"
#define ios std::ios::sync_with_stdio(0),std::cin.tie(0),std::cout.tie(0)
void solve()
{
	
}
signed main()
{
	ios;
	solve();
	return 0;
}

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值