dfs学习3

/*
参数设置:什么在变化,就把什么设置成参数
void dfs()
{
	if (到达终点状态)
	{
		…//根据题目书写内容
			return;
	}
	if (越界或者不合法状态)
		return;
	if (特殊状态)//剪枝
		return;
	for (扩展方式)
	{
		if (扩展方式所达到状态合法)
		{
			修改操作;//根据题意来添加
				标记;
				dfs();
				(还原标记);
				//是否还原根据题意
		}
	}
}*/
//一、dfs全排列
#include<iostream>
using namespace std;
int n;
int p[10] = { 0 };
bool vis[10] = { 0 };
void dfs(int x);
//变化内容:填数的位置在变化
int main()
{
	while (cin >> n)
	{
		dfs(1);
	}
	return 0;
}
void dfs(int x)
{
	if (x == n + 1)
		//1.到达终点状态
	{
		for (int i = 1; i <= n; i++)
			cout << p[i] << " ";
		    cout << endl;
			//1.1根据题意书写内容
		    return;
	}       //1.2返回
	//2.越界或者不合法状态直接return(在这个题中没有)
	//3.特殊状态进行剪枝处理(假定要求顺序输出的话)
	for (int i = 1; i <= n; i++)
		//4.根据题意拓展
	{
		//if (i > p[x])return;这么填写就错了,一般情况下要返回,但考虑不到后面的情况了
		if (vis[i] = false && i>p[x])
			//4.1拓展方式合法
		{
			p[x] = i;
			vis[i] = true;
			//4.2标记
			dfs(x + 1);
			vis[i] = false;
			//4.3还原标记(是否还原根据题意,加上即回溯)
		}
	}
}
//二、组合+判断素数
#include<iostream>
using namespace std;
int n, k ,ans=0;
int num[100];
bool isprime(int n)
{
	if (n <= 1)
		return false;
	for (int i = 2; i * i <= n; i++)
		if (n % i == 0)
			return false;

	return true;
}//判断素数
void dfs(int index, int nowk, int nowsum);
//1.状态定义:当前数,规定选择数,当前和这三个变化量
int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
		cin >> num[i];
	dfs(0, 0, 0);
	//从最初的状态开始处理
	cout << ans << endl;
}
void dfs(int index, int nowk, int nowsum)
{
	if (index == n + 1 || nowk == k + 1)
		return;
	//2.边界条件
	if (index == n && nowk == k)
		//3.终点
	{
		//3.1根据题意写相应代码
		if (isprime(nowsum))
		{
			ans++;
		}
		return;
	}
	dfs(index + 1, nowk + 1, nowsum + num[index]);//选择当前数
	dfs(index + 1, nowk, nowsum);			      //不选当前数
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值