符号三角形问题

#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;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值