DFS

来源:互联网 发布:西湖金座大酒店桑拿js 编辑:程序博客网 时间:2024/05/01 02:49

DFS(深度优先搜索),一条路搜到底,不撞南墙不回头,一般用于判断给定一些元素能否得到结果,和BFS刚好相对,有一个隐式的栈,需要用递归实现。

题目:

给定n个元素,这些元素相加(每个元素最多用一次),能得到k吗?

核心代码:

bool dfs(int i, int sum){if(i == n)return sum == k;//加不加的情况都遍历一下 if(dfs(i + 1, sum))return true;if(dfs(i + 1, sum + v[i]))return true;return false;}
这个题也可以用dp来做。

题目:

hdoj : http://acm.hdu.edu.cn/showproblem.php?pid=1016

思路:建一个数组用来存每一步的结果,因为是递归,可以每次截取一段这个数组,因为结果共享这个数组的一段,也就是从结果回到分支处,再走向下一个分支。

AC代码:

#include<iostream>using namespace std;int n, nums[30];void print(int str[]){    printf("%d", str[0]);    for(int i = 1; i < n; i++)        printf(" %d", str[i]);    printf("\n");}bool find(int a, int b){    for(int i = 1; i < a; i++)        if(b == nums[i])            return true;    return false;}bool isPrime(int a){    for(int i = 2; i * i <= a; i++)        if(!(a % i))            return false;    return true;}void dfs(int a){    if(a == n)    {        if(isPrime(nums[a - 1] + 1))            print(nums);    }    else        for(int i = 2; i <= n; i++)            if(!find(a, i) && isPrime(i + nums[a - 1]))//在数组0到a - 1的位置寻找是否有i这个元素,如果没有并且i + a - 1是素数,就将i加到数组上            {                nums[a] = i;                dfs(a + 1);            }}main(){    int cnt = 1;    nums[0] = 1;    while(~scanf("%d", &n))    {        printf("Case %d:\n", cnt++);        dfs(1);        printf("\n");    }}


0 0