C/C++深度优先搜索(递归树模拟)

只愿长相守 提交于 2019-12-05 04:50:51
 1 //C++深度优先搜索(递归树模拟)
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <iostream>
 4 #define MAX_N 1000
 5 using namespace std;
 6     int a[MAX_N];
 7     int n,k;
 8     
 9 //已经从前i项得到了和sum,然后对于i项之后的进行分支 
10 bool dfs(int i,int sum)
11 {
12     //如果前n项都计算过了 ,则返回sum是否与k相等 
13     if(i==n)
14     {
15         return sum==k;
16      } 
17     
18     //不加上a[i]的情况的分支 
19     if(dfs(i+1,sum)) 
20     {
21         return true;
22     }
23     //加上a[i]的情况的分支 
24     //if(dfs(i+1,sum+a[i+1]))
25     if(dfs(i+1,sum+a[i]))  
26     {
27         return true;
28     }
29     
30     //无论是否加上a[i]都不能凑成k就返回false 
31     return false;
32  } 
33  void solve()
34  {
35      //if(dfs(1,0)) 
36      if(dfs(0,0)) 
37     {
38          cout<<"Yes"<<endl;
39     }
40      else  
41      {
42          cout<<"No"<<endl;
43      }
44 } 
45 int main(void)
46 {
47     cin>>n;
48     int i,temp;
49     //for(i=1;i<=n;i++)
50     for(i=0;i<n;i++)
51     {
52         cin>>temp;
53         a[i]=temp;
54     }
55     cin>>k;
56     
57     solve();
58     
59     return 0;
60 }
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 当然,当人们刚刚掌握深度优先搜索的时候常常用它来走迷宫.事实上我们还有别的方法,那就是广度优先搜索(BFS).
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!