您的位置:首页 > 其它

符号三角形问题

2015-10-16 17:43 295 查看
#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: