0
点赞
收藏
分享

微信扫一扫

【javaWeb & Maven高级】Maven高级学习

Hyggelook 04-07 12:30 阅读 0

注: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;
		else
		cout<<"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;
 } 

举报

相关推荐

0 条评论