计蒜客 等边三角形 dfs

题目:

https://www.jisuanke.com/course/2291/182238

思路:

1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长,index是数组的下标

从dfs(0,0,0,0)开始,每次选的长度可能加到a,也可能b,也可能c,

三种可能分别dfs:

dfs(a+len[index+1],b,c,index+1);
dfs(a,b+len[index+1],c,index+1);
dfs(a,b,c+len[index+1],index+1);

2.剪枝

数据太大的边直接结束递归,此题中因为是求等边三角形,对于所有边的和sum,除以三的值肯定是大于等于abc三条边的。

3.提取重复的运算

一开始我sum没有/3,而是在dfs里面/3判断,所以就TLE了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<queue>
 6 using namespace std;
 7 //计蒜客 等边三角形
 8 int len[25],n;
 9 bool ok;
10 int sum;
11 void dfs(int a,int b,int c,int index)//a,b,c三条边的边长,index是数组的下标 
12 {
13     if(a>sum||b>sum||c>sum)//剪枝 
14     return;
15     if(index>n)
16         return;
17     if(a==b&&b==c&&index==n)
18     {
19         ok=true;
20         return;
21     }
22     
23     if(ok)
24     return;
25     
26     {
27         dfs(a+len[index+1],b,c,index+1);
28         dfs(a,b+len[index+1],c,index+1);
29         dfs(a,b,c+len[index+1],index+1);
30     }
31 }
32 int main()
33 {
34     while(scanf("%d",&n)==1)
35     {
36         sum=0;
37         for(int i=1;i<=n;++i)
38         {
39             scanf("%d",&len[i]);
40             sum+=len[i];
41         }
42         ok=false;
43         sum/=3;
44         dfs(0,0,0,0);
45         if(ok)
46         printf("yes\n");
47         else
48         printf("no\n");
49     }
50     return 0;    
51 } 

 

posted @ 2019-03-29 18:07  付玬熙  阅读(271)  评论(0编辑  收藏  举报