等腰三角形

Time Limit: 2 Seconds       Memory Limit: 65536 KB

Edward 对等腰三角形情有独钟,据说他能在 0.0001s 内判断出一个图形是否是等腰三角形!但是,这还不能满足 Edward,最近,他又研究出来一种等腰三角形的新玩法。他随意收集了 5 根木棍,然后想要尽快计算出,使用这 5 根木棍能组成多少种不同的等腰三角形。但是这对他来说太难了,你能帮助他吗?

每根木棍在使用时不能弯折,但可以弃置不用。三角形的每条边可以由一根或多根木棍拼接而成。

输入格式

一个整数 T,表示有多少组测试数据。

对于每组测试数据,给出 5 个不超过 100 的正整数,代表选出的 5 根木棒的长度。

输出格式

输出能组成的不同等腰三角形的个数。

样例输入

2
1 1 1 1 1
1 1 1 1 2

样例输出

2
3

#include<stdio.h>

int a[10],s[10],v[10],xx[10],yy[10];
int ans;

void check() {
	int x,y,flag,i;
	if (s[1]==s[2]) x=s[1],y=s[3]; else
	if (s[1]==s[3]) x=s[1],y=s[2]; else
	if (s[2]==s[3]) x=s[2],y=s[1]; else
	return;
	if (x && y && 2*x>y) {
		flag=1;
		for (i=1;i<=ans;i++) if (xx[i]==x && yy[i]==y) {
			flag=0;
			break;
		}
		if (flag) {
			ans++;
			xx[ans]=x;
			yy[ans]=y;
		}
	}
}

void dfs(int dep) {
	int i;
	if (dep>3) {
		check();
		return;
	}
	dfs(dep+1);
	for (i=1;i<=5;i++) if (!v[i]) {
		v[i]=1;
		s[dep]+=a[i];
		dfs(dep);
		s[dep]-=a[i];
		v[i]=0;
	}
}

int main() {
	int tt,i;
	scanf("%d",&tt);
	while (tt--) {
		for (i=1;i<=5;i++) scanf("%d",a+i);
		ans=0;
		dfs(1);
		printf("%d\n",ans);
	}
}

你可能感兴趣的:(等腰三角形)