计蒜客 等边三角形 dfs

本文介绍了一个使用深度优先搜索(DFS)解决等边三角形问题的算法。通过递归地分配不同边长,尝试构建等边三角形,并采用剪枝策略减少搜索空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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 } 

 

转载于:https://www.cnblogs.com/fudanxi/p/10623026.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值