DFS算法(C/C++)(内含立例题)

 DFS:

DFS又称深度优先搜索,是一种图运算方法,它从第一个节点走起,一直往下走,一直走到不能继续再走,就返回上一个节点,继续搜索其他地方,直到找到目标节点为止。

DFS可以解决迷宫问题:

1.先选择一条路一直走下去,直到遇到死胡同,不能继续往下走时;

2.返回上一个分岔口,选择其他路径走,一定能找到一条通往出口的路

DFS更加适合处理深度优先的问题 

废话不多说,直接上例题

例题

洛谷P1036 [NOIP2002 普及组] 选数

PS:这是一道纯暴力搜索的问题,前提是要会递归(!ovo!)

题目描述:

AC代码: 
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
int n, k;
int a[100000];
//一个简单的判断素数的函数
int is(int x) {
	if (x == 1) {
		return 0;
	}
	else if (x == 2) {
		return 1;
	}else{
		for (int i = 2; i <= sqrt(x); i++) {
			if (x % i == 0) {
				return 0;
			}
		}
		return 1;
	}
}
int num1 = 0;    //记录种类数
void dfs(int num, int sum, int kai) {
	//num是当前相加的数字个数
	//sum是num个数相加的总和
	//kai是起始的数字位置
	if (num == k) {     //当相加的数字总数等于k时
		if (is(sum) == 1) {
			num1++;        //是素数就有一个满足题意的值
		}
		return ;
	}
	else {
		for (int i = kai; i < n; i++) {        //从起始位置向后进行递归搜索
			dfs(num + 1, sum + a[i], i + 1);
		}
	}
}
int main() {
	cin >> n >> k;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a, a + n);    //这里的排序写在底下了嗷
	dfs(0, 0, 0);       //起始的num,sum,kai都是0
	cout << num1 << endl;
	return 0;
}
一些废话:

其实这道题的难点是:怎么去重;

去重所使用的方法就是:不降原则

不降原则顾名思义就是所加的数只增不降,因此要保证数组中的数据是升序的,进行一个sort排序即可(ennnnn,不过其实真正的不降原则是可以相等的,但是这一题是不可以的,但是题上给的数据有点奇怪,是没有重复的,并且给出的就是升序的,如果数据有相等的话,在加上一个对数组a的去重步骤即可)

 

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值