题目: 下面都是“-”。 下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。
#include<stdio.h>
#define max 100
int arr[max][max];
int n;
int sum[2];
int half;
int ans_sum;
void print()
{
int i,j,k,l;
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i+1;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
void BackTrack(int level)
{
if(sum[0]>half||sum[1]>half)
return;
if(level==n+1)
{
if(sum[0]==sum[1]&&((sum[1]+sum[0])==n*(n+1)/2))
{
print();
ans_sum++;
}
}
else
{
int i,j,k,l;
for(i=0;i<2;i++)
{
arr[1][level] = i;
sum[i]++;
for(j=2;j<=level;j++)//递推子树
{
arr[j][level-j+1] = !(arr[j-1][level-j+1] ^ arr[j-1][level-j+2]);
sum[arr[j][level-j+1]]++;
}
BackTrack(level+1);
for(j=2;j<=level;j++)//回溯时取消上一次的赋值
{
sum[arr[j][level-j+1]]--;
}
sum[i]--;
}
}
}
int main(void)
{
printf("请输入符号三角形第一行符号的个数n:");
scanf("%d",&n);
half = n*(n+1)/4;
if(n*(n+1) /2 % 2 == 1)
{
printf("No answer!\n");
return 0;
}
ans_sum = 0;
BackTrack(1);
if(ans_sum==0)
printf("No answer!\n");
else
printf("满足要求的符号三角形总共有%d个",ans_sum);
return 0;
}