#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX 10
int n; //三角形第一行的符号个数
int count = 0; //加号个数
int half; //n*(n+1/4 应有的+、-号个数
int sum = 0; //满足+号等于-号的三角形个数
int p[MAX][MAX]; //存储三角形符号
//i表示搜索到第i层
void backtrack(int i)
{
if(count>half || (i*(i-1)/2-count)>half) //剪枝,如果+号或-号个数超过符号总数的一半
return;
if(i>n) //搜索到叶子结点
sum++;
else
{
int j;
for(j=0; j<2; j++)
{
p[1][i] = j; //第i层,三角形第一行的第i个符号,0表示-,1表示+
count += p[1][i]; //+号个数
int t;
for(t=2; t<=i; t++) //从三角形的第2到第i行
{
/*确定第1行第i个元素后,再依次考虑新加入的斜边所对应的各行(2到i)
中相应元素的具体值,并累加+号数目 */
p[t][i-t+1] = p[t-1][i-t+1]^p[t-1][i-t+2];
count+=p[t][i-t+1];
}
backtrack(i+1); //搜索下一层
for(t=2; t<=i; t++) //为返回上一层作准备
{
count-=p[t][i-t+1];
}
count -= p[1][i];
}
}
}
//计算+号等于-号的三角形个数
void compute()
{
half = n*(n+1)/2;
if(half % 2 ==1) //如果总数为奇数,不满足
sum = 0;
else
{
half /= 2;
memset(p, 0, sizeof(p)); //将三角形符号数组初始化为0
backtrack(1);
}
}
int main()
{
printf("输入三角形第一行符号个数:");
scanf("%d", &n);
compute();
printf("+号等于-号的三角形个数为:%d\n", sum);
return 0;
}
符号三角形问题
最新推荐文章于 2021-02-28 08:17:37 发布