网站制作 万网,用户界面设计的重要性,全球可以做外贸的社交网站,淘宝网站建设教程视频题目连接#xff1a;https://www.lanqiao.cn/problems/3511/learning/
思路#xff1a;由于数据范围很小#xff0c;所有选择用DFS枚举所有飞机的所有的降落顺序#xff0c;看哪个顺序可以让所有飞机顺利降落#xff0c;有的话就算成功方案#xff0c;输出了“YES”。
…题目连接https://www.lanqiao.cn/problems/3511/learning/
思路由于数据范围很小所有选择用DFS枚举所有飞机的所有的降落顺序看哪个顺序可以让所有飞机顺利降落有的话就算成功方案输出了“YES”。
代码如下
//飞机降落 暴力枚举DFS
#includebits/stdc.h
#define int long long
using namespace std;
const int N 10 20;struct plane{int t, d, l;
}p[N];bool st[N];//判断当前飞机是否已经降落int n;//飞机个数。//u表示已经有U架飞机成功降落了。
//time表示当前的时间,前一架飞机落地的时间。
bool dfs(int u, int time)
{if(u n)return true;//考虑第u 1架飞机谁落。for(int i 0; i n; i ){if(!st[i]){st[i] true;if(p[i].t p[i].d time){//回溯回溯到DFS之前的状态。st[i] false;return false;}int t max(time, p[i].t) p[i].l;if(dfs(u 1, t))return true;//回溯回溯到DFS之前的状态。st[i] false;}}return false;
}void solve()
{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;elsecout NO endl;for(int i 0; i n; i )st[i] false;
} signed main()
{ios::sync_with_stdio(0);cin.tie(0);int t 1;cin t;while(t--)solve();
}这里可能大家会有个小问题if(dfs(u 1, t))这一步为什么要判断为什么直接dfs(u1,t)不对
答因为如果不判断的话当unum时(也就是找到飞机能正常降落的步骤)返回return 并不是直接退出而是到了num-1层然后相当于是递归回去最后到了第0层因为没有判断所以直接接着往下走返回false。也就是说不加判断整个程序返回的是第0层的结果false。而我们之前一般的dfs之所以不加判断是因为在nnum的时候直接把结果输出来了就算递归回去也不影响。