拼三角
题目链接:nowcoder 219046
到主站看:https://blog.csdn.net/weixin_43346722/article/details/116171759
题目大意
给你 6 个数,分你能不能分成两组各三个数,使得每组以这三个数为边长都可以构成三角形。
思路
就直接暴搜出每一种分组情况然后判断。
判断能否构成三角形就是两个短的边相加大于第三条边。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T, a[11];
int l[11], r[11];
bool cmp(int x, int y) {
return x < y;
}
bool dfs(int now) {
if (now > 6 && l[0] == 3 && r[0] == 3) {
int ll[11] = {0, l[1], l[2], l[3]}, rr[11] = {0, r[1], r[2], r[3]};
sort(ll + 1, ll + 3 + 1, cmp);//按边排序
sort(rr + 1, rr + 3 + 1, cmp);
if (ll[1] + ll[2] > ll[3] && rr[1] + rr[2] > rr[3]) return 1;//能构成三角形就是要满足短的两条边加起来大于第三条边
else return 0;
}
if (now > 6) return 0;
if (l[0] <= 2) {//dfs 暴搜放第一组
l[++l[0]] = a[now];
if (dfs(now + 1)) return 1;
l[l[0]--] = 0;
}
if (r[0] <= 2) {//dfs 暴搜放第二组
r[++r[0]] = a[now];
if (dfs(now + 1)) return 1;
r[r[0]--] = 0;
}
return 0;
}
int main() {
scanf("%d", &T);
while (T--) {
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
for (int i = 1; i <= 6; i++)
scanf("%d", &a[i]);
if (dfs(1)) printf("Yes\n");
else printf("No\n");
}
return 0;
} 
京公网安备 11010502036488号