【真题解析】题目 3151: 蓝桥杯2023年第十四届省赛真题-飞机降落【C++ DFS 超详解注释版本】

爆搜冥想

  • 暴力枚举每一辆飞机
  • 对于每一个飞机都只存在两种情况,可以降落和不可以降落
  • 如果可以降落,计算降落后最早可以降落的时间pre,作为下一次递归的传参
  • 如果不可以降落,枚举下一辆飞机

注意这辆的降落有盘旋这种量子叠加态!

说人话就是:

  • 降落时有两种情况,一种是开始降落时间比pre后,那么从这个降落时间开始往后计算进行下一次递归即可。
  • 还有一种就是,在盘旋的状态中可以降落,那么就直接用pre计算下一次最早降落的时间,也就是结束盘旋状态立即降落。

核心出装

c 复制代码
//plane.st:最早开始时间	plane.con:可持续时间 plane.netm:落地需要的时间 
bool dfs(vector<plane> &v,vector<bool> &bl,int pre,int count){			//pre和count默认是为0的 
    if(count==v.size()) return true;									//如果搜索了全部的飞机,函数返回true             
    for(int i=0;i<v.size();i++){										//遍历数组中所有飞机                
        if(bl[i] == false){												//如果找到一架飞机没有降落就使它降落 
            bl[i] = true;												//将该飞机的状态设置为已经降落 
            if(pre < v[i].st){											//如果这辆斐济满足降落条件 
                if(dfs(v, bl, v[i].st+v[i].netm, count+1)) return true;	//继续搜索这辆飞机降落后的时间,如果满足返回true 
            }else if(pre <= v[i].st+v[i].con){							//如果这辆飞机盘旋后可以满足降落条件 
                if(dfs(v, bl, pre+v[i].netm, count+1)) return true;		//让这一架飞机立即降落,搜索它降落后的情况,满足返回true 
            }
            bl[i] = false;												//如果不满足降落条件,将这辆飞机的状态恢复成false 
        }
    }
    return false;														//搜索结束找不到返回false 
}

返回泉水

c 复制代码
// 蓝桥真题-飞机降落 
#include<bits/stdc++.h>
using namespace std;
class plane{
public:
    int st;//最早开始时间 
    int con;//可持续费的时间 
    int netm;//落地需要的时间  
    plane(int s,int c,int ne){
        st=s;
        con=c;
        netm=ne;
    } 
};
//plane.st:最早开始时间	plane.con:可持续时间 plane.netm:落地需要的时间 
bool dfs(vector<plane> &v,vector<bool> &bl,int pre,int count){			//pre和count默认是为0的 
    if(count==v.size()) return true;									//如果搜索了全部的飞机,函数返回true             
    for(int i=0;i<v.size();i++){										//遍历数组中所有飞机                
        if(bl[i] == false){												//如果找到一架飞机没有降落就使它降落 
            bl[i] = true;												//将该飞机的状态设置为已经降落 
            if(pre < v[i].st){											//如果这辆斐济满足降落条件 
                if(dfs(v, bl, v[i].st+v[i].netm, count+1)) return true;	//继续搜索这辆飞机降落后的时间,如果满足返回true 
            }else if(pre <= v[i].st+v[i].con){							//如果这辆飞机盘旋后可以满足降落条件 
                if(dfs(v, bl, pre+v[i].netm, count+1)) return true;		//让这一架飞机立即降落,搜索它降落后的情况,满足返回true 
            }
            bl[i] = false;												//如果不满足降落条件,将这辆飞机的状态恢复成false 
        }
    }
    return false;														//搜索结束找不到返回false 
}
int main(){
    int t;
    cin>>t;						//输入测试数据总数 
    while(t--){					//执行对应次数 
        int n;					//输入飞机数量 
        cin>>n;
        vector<plane> v;		//初始化动态数组存放飞机 
        vector<bool> bl(n,false);	//每一辆飞机的状态初始化为false 
        while(n--){				//输入每一架飞机的信息 
            int t,d,l;			 
            cin>>t>>d>>l;
            v.push_back(plane(t,d,l));		//将该飞机推入动态数组 
        }
        if(dfs(v,bl,0,0)) cout<<"YES"<<endl;	//如果搜索到一种情况能使得飞机们降落返回true 
        else cout<<"NO"<<endl;					//否则返回false 
    }
    return 0;
}

结语🤣

这一次blog尝试了比较抽象的标题,这里进行解读:

  • 爆搜冥想:即核心思想,思路过程。
  • 核心出装:即完成功能的主要实现函数,dfs函数。
  • 返回泉水:即所有代码的一览。

编译环境

C++ 11 && DevC++

相关推荐
爱摸鱼的孔乙己34 分钟前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
烦躁的大鼻嘎1 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝1 小时前
C/C++内存管理
java·c语言·c++
fhvyxyci1 小时前
【C++之STL】摸清 string 的模拟实现(下)
开发语言·c++·string
C++忠实粉丝1 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
古月居GYH2 小时前
在C++上实现反射用法
java·开发语言·c++
Betty’s Sweet2 小时前
[C++]:IO流
c++·文件·fstream·sstream·iostream
敲上瘾2 小时前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
不会写代码的ys2 小时前
【类与对象】--对象之舞,类之华章,共绘C++之美
c++
兵哥工控2 小时前
MFC工控项目实例三十二模拟量校正值添加修改删除
c++·mfc