Description
符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的"+"和"-"的个数相同。
在一般情况下,符号三角形的第一行有n个符号。如图所示是由14个"+"号和14个"-"号组成的符号三角形。两个同号下面都是"+",两个异号下面都是"-"号。
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
Input
输入的第一个为测试样例的个数T,接下来有T个测试样例。每个测试样例的只有一行n ( n ≤ 25 )。
Output
对应每个测试样例输出一行,格式为"Case #: M",其中'#'表示第几个测试样例(从1开始计),M为不同的符号三角形个数。
Sample Input
2
2
3
Sample Output
Case 1: 0
Case 2: 4
#include<stdio.h>
int a[27][27];
int k,n,sum,y;
void t(int m)
{
if(y>k||m*(m-1)/2-y>k) return ;
if(m>n)
{
sum++;
return ;
}
a[1][m]=0;
int i=y,j;
for(j=2;j<=m;j++)
{
a[j][m-j+1]=a[j-1][m-j+1]^a[j-1][m-j+2];
y+=a[j][m-j+1];
}
t(m+1);
a[1][m]=1;
y=i+1;
for(j=2;j<=m;j++)
{
a[j][m-j+1]=a[j-1][m-j+1]^a[j-1][m-j+2];
y+=a[j][m-j+1];
}
t(m+1);
}
int main()
{
int m,i,j;
scanf("%d",&m);
for(j=1;j<=m;j++)
{
scanf("%d",&n);
k=n*(n+1)/2;
if(k&1)
{
printf("Case %d: 0\n",j);
continue;
}
sum=0;
y=0;
k/=2;
t(1);
printf("Case %d: %d\n",j,sum);
}
return 0;
}