版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/89515128
直接先排序然后枚举三角形的边值,用两边之和大于第三边,两边之差小于第三边来判断,可以带dfs优化
#include<bits/stdc++.h>
using namespace std;
int T,n=12;
long long ans,l[15];
bool vis[15];
inline long long read()
{
long long k=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9')
k=(k<<3)+(k<<1)+ch-'0',ch=getchar();
return k*f;
}
void dfs(int ret)
{
if(ret>ans)
ans=ret;
if(ans==4)
return;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
for(int j=i+1;j<=n;j++)
{
if(!vis[j])
{
for(int k=j+1;k<=n;k++)
{
if(!vis[k])
{
if(l[i]+l[j]>l[k])
{
vis[i]=vis[j]=vis[k]=true;
dfs(ret+1);
vis[i]=vis[j]=vis[k]=false;
}
}
}
}
}
}
}
}
int main(){
scanf("%d",&T);
while(T--)
{
for(int i=1;i<=n;i++)
l[i]=read();
sort(l+1,l+n+1);
ans=0;
dfs(0);
printf("%lld\n",ans);
}
return 0;
}