DFS入门+例题

				版权声明:欢迎转载,如果转载,请注明转载地址,谢谢你啦!觉得文章不错的话右上角点个赞再走呀!					https://blog.csdn.net/qq_40763929/article/details/81629800				</div>
							            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
					<div class="htmledit_views" id="content_views">
            <blockquote>

以下是全网收集整理的和自己写的部分,绝对保证dfs轻松入门。 

核心代码:

关于dfs参数问题,什么在变化,就把什么设置成参数。


  
  
  1. void dfs()//参数用来表示状态
  2. {
  3. if(到达终点状态)
  4. {
  5. ... //根据题意添加
  6. return;
  7. }
  8. if(越界或者是不合法状态)
  9. return;
  10. if(特殊状态) //剪枝
  11. return ;
  12. for(扩展方式)
  13. {
  14. if(扩展方式所达到状态合法)
  15. {
  16. 修改操作; //根据题意来添加
  17. 标记;
  18. dfs();
  19. (还原标记);
  20. //是否还原标记根据题意
  21. //如果加上(还原标记)就是 回溯法
  22. }
  23. }
  24. }

 dfs全排列:


  
  
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int p[ 10]={ 0};
  5. bool vis[ 10]={ 0};
  6. int n;
  7. void dfs(int x)
  8. {
  9. if (x==n+ 1)
  10. {
  11. for( int i= 1;i<=n;i++)
  12. cout<<p[i]<< " ";
  13. cout<< endl;
  14. return ;
  15. }
  16. for ( int i= 1;i<=n;i++)
  17. {
  18. if (vis[i]== false )
  19. {
  20. p[x] = i;
  21. vis[i] = true;
  22. dfs(x+ 1);
  23. vis[i] = false;
  24. }
  25. }
  26. }
  27. int main()
  28. {
  29. while ( cin>>n)
  30. {
  31. dfs( 1);
  32. }
  33. return 0;
  34. }

 在全排列的代码基础上    如果要求是顺序输出,则要剪枝,(只需要加一句代码):


  
  
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int p[ 10]={ 0};
  5. bool vis[ 10]={ 0};
  6. int n;
  7. void dfs(int x)
  8. {
  9. if (x==n+ 1)
  10. {
  11. for( int i= 1;i<=n;i++)
  12. cout<<p[i]<< " ";
  13. cout<< endl;
  14. return ;
  15. }
  16. for ( int i= 1;i<=n;i++)
  17. {
  18. if (vis[i]== false && i>p[x]) //加上这句代码,也就是剪枝,可以避免下面的递归
  19. {
  20. p[x] = i;
  21. vis[i] = true;
  22. dfs(x+ 1);
  23. vis[i] = false;
  24. }
  25. }
  26. }
  27. int main()
  28. {
  29. n= 4;
  30. dfs( 1);
  31. return 0;
  32. }

dfs 全排列的巧妙运用:

问题 C: 【递归入门】组合+判断素数

时间限制: 1 Sec  内存限制: 128 MB
提交: 205  解决: 77
[提交][状态][讨论版][命题人:外部导入]

题目描述

已知 n 个整数b1,b2,…,bn

以及一个整数 k(k<n)。

从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。

例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
    3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。
  现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29。

输入

第一行两个整数:n , k (1<=n<=20,k<n) 
第二行n个整数:x1,x2,…,xn (1<=xi<=5000000) 

输出

一个整数(满足条件的方案数)。 

样例输入


  
  
  1. 4 3
  2. 3 7 12 19

样例输出

1
  
  

  
  
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. bool isprime(int n)
  5. {
  6. if (n<= 1)
  7. return false;
  8. for ( int i= 2;i*i<=n;i++)
  9. if (n%i== 0)
  10. return false;
  11. return true;
  12. } //判断素数
  13. int a[ 22];
  14. int b[ 22];
  15. int p[ 22];
  16. bool vis[ 22];
  17. int n,k,sum,ans;
  18. void dfs(int index)
  19. {
  20. if (index==k+ 1)
  21. {
  22. if (isprime(sum))
  23. ans++; //看是否加起来是素数
  24. for ( int i= 1;i<=index -1;i++)
  25. cout<<p[i]<< " ";
  26. cout<< endl;
  27. return ;
  28. }
  29. for ( int i= 1;i<=n;i++)
  30. {
  31. if (vis[i]== false && i>p[index -1]) //保证这个排列是按顺序来的,避免重复计算导致答案错误
  32. {
  33. p[index] = i;
  34. vis[i] = true;
  35. sum+=a[i]; //最巧妙的地方,,利用全排列的排列过程中,来加上我输入的数字
  36. dfs(index+ 1);
  37. vis[i] = false;
  38. sum-=a[i]; //有加就有减
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. memset(b, 0, sizeof(b));
  45. memset(vis, 0, sizeof(vis));
  46. cin>>n>>k;
  47. for ( int i= 1;i<=n;i++)
  48. cin>>a[i],p[i]=i; //一开始要从第一个排列填好 才开始遍历 ,这与传统的dfs全排列做了点变化
  49. ans= 0;
  50. dfs( 1);
  51. cout<<ans<< endl;
  52. return 0;
  53. }
  54. //妈的,这个答案真巧妙

初学dfs:先做最最最基础的题: http://codeup.cn/contest.php?cid=100000608

做完了,你就入门了(绝对没有比这更基础的题了)

然后再做下面的题:

题型分类:

写过这些入门题后,我们可以将DFS题分为两大类: 


1 . 地图型:这种题型将地图输入,要求完成一定的任务。因为地图的存在。使得题意清楚形象化,容易理清搜索思路。

2 . 数据型:这种题型没有给定地图,一般是一串数字或字母,要求按照一定的任务解题。相对于地图型,这种题型较为抽象,需要在数据中进行搜索。数据以数组的形式存储,那么只要将数组也当作一张图来进行搜索就可以了。

				版权声明:欢迎转载,如果转载,请注明转载地址,谢谢你啦!觉得文章不错的话右上角点个赞再走呀!					https://blog.csdn.net/qq_40763929/article/details/81629800				</div>
							            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
					<div class="htmledit_views" id="content_views">
            <blockquote>

猜你喜欢

转载自blog.csdn.net/weirdo_coder/article/details/88702504