DFS(排列数字、飞机降落、选数、自然数的拆分)

2024-04-06 22:44

本文主要是介绍DFS(排列数字、飞机降落、选数、自然数的拆分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注:1.首先要知道退出条件

        2.还原现场

 典型:全排列

题目1:

代码:

#include<bits/stdc++.h>
using namespace std;
int a[1005],p[1005],v[1005];
int n;
void dfs(int x)
{//此次dfs结束条件,即搜到底 if(x==n+1){for(int i=1;i<=n;i++)cout<<p[i]<<" "; cout<<endl;return ;}for(int i=1;i<=n;i++){if(!v[a[i]])//若该数字未访问 {p[x]=a[i];//记录该数字v[a[i]]=1;dfs(x+1);//搜索下一个位置 v[a[i]]=0; //上面搜索完之后,回溯 }}
}
int main()
{cin>>n;for(int i=1;i<=n;i++)a[i]=i;dfs(1);return 0;} 

题目2:P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码(含解析): 

#include<bits/stdc++.h>
using namespace std;
int n;
int t[15],d[15],l[15],v[15];
int flag;//标记该是否有满足条件的降落顺序 
void dfs(int preTime,int x)//preTime用于记录上一架飞机降落完毕的时间,x用于记录当前降落飞机数量 
{if(x==n+1)//此时所有飞机降落完成,退出 {flag=1;return;}for(int i=1;i<=n;i++) {if(v[i]==0&&preTime<=t[i]+d[i])//若当前飞机还未访问且当前飞机油未耗尽,当前飞机可为下一个降落的飞机 {v[i]=1;//已访问 dfs(max(t[i],preTime)+l[i],x+1);//访问这轮dfs的下一个节点 v[i]=0;//还原现场 }}
}
int main()
{int T;cin>>T;while(T--){flag=0; cin>>n;for(int i=1;i<=n;i++)cin>>t[i]>>d[i]>>l[i];dfs(0,1);//可理解为上一架飞机降落时间为0,此时寻找第一架降落飞机 if(flag==1)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;
}

题目3:P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码(含解析):

#include<bits/stdc++.h>
using namespace std;
int a[25],v[25];
int n,k;
int ans;
bool isPrime(int x)//判断是否为素数 
{if(x<=3)return x>1;for(int i=2;i<=sqrt(x);i++){if(x%i==0)return false;}return true;
}
//cnt代表选了多少个数,sum为cnt个数的和,st代表从哪个数开始 
void dfs(int cnt,int sum,int st)
{if(cnt==k+1)//若已经选完了k个数(sum为K个数的和) {if(isPrime(sum))ans++;}for(int i=st;i<=n;i++){if(v[i]==0){v[i]=1;dfs(cnt+1,sum+a[i],i+1);v[i]=0;}}
}
int main()
{cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];dfs(1,0,1);cout<<ans;return 0;} 

题目4: P2404 自然数的拆分问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int p[1000];
//sum记录当前数的和,cnt代表当前要找第cnt个数,st代表当前从几开始加 
void dfs(int sum,int cnt,int st)
{if(sum>n) return;//退出条件 if(sum==n) {// cnt代表当前找的数的个数,当前找到的为cnt-1个数 for(int i=1;i<=cnt-2;i++)cout<<p[i]<<"+";cout<<p[cnt-1]<<endl;return;}for(int i=st;i<=n-1;i++){p[cnt]=i;//记录路径 dfs(sum+i,cnt+1,i);} 
}
int main()
{cin>>n;dfs(0,1,1);return 0;} 

这篇关于DFS(排列数字、飞机降落、选数、自然数的拆分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881016

相关文章

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

ural 1149. Sinus Dances dfs

1149. Sinus Dances Time limit: 1.0 second Memory limit: 64 MB Let  An = sin(1–sin(2+sin(3–sin(4+…sin( n))…) Let  Sn = (…( A 1+ n) A 2+ n–1) A 3+…+2) An+1 For given  N print  SN Input One

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar

AIGC6: 走进腾讯数字盛会

图中是一个程序员,去参加一个技术盛会。AI大潮下,五颜六色,各种不确定。 背景 AI对各行各业的冲击越来越大,身处职场的我也能清晰的感受到。 我所在的行业为全球客服外包行业。 业务模式为: 为国际跨境公司提供不同地区不同语言的客服外包解决方案,除了人力,还有软件系统。 软件系统主要是提供了客服跟客人的渠道沟通和工单管理,内部管理跟甲方的合同对接,绩效评估,BI数据透视。 客服跟客人

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成