符号三角形问题

图所示的三角形中,有14个“+“和14个“-”。2个同号下面是+,两个异号下面是-

      在一般情况下,符号三角形的第一行有n个符号。符号三角形问题,要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”相同。

+ + - + - + +

+ - - - - +

- + + + -

- + + -

- + -

- -

+

暴力

#include<stdio.h>
#include<math.h>
#define n 7
int count=0;//表示符号个数 
int a[n+1][n+1]={0};
int sum=0;//表几种解法 

int main(){
	int half=n*(n+1)/4;
	if((n*(n+1)/2)%2==0){//如果两个符号个数相同则其总数必为偶数
		for(int num=0;num<pow(2,n);num++){
			int mm=num;
			count=0;
			for(int i=0;i<n;i++){
					a[0][i]=mm%2;
					count+=mm%2;
					for(int j=1;j<=i;j++){
						a[j][i-j]=a[j-1][i-j]^a[j-1][i-j+1];//表示a[0][t]那一条斜线上的
						count+=a[j][i-j];//统计1的个数 
					}
				mm/=2;
			}
			if(count==half)
		 		sum++;
		} 
		printf("不同的符号三角形的个数为:%d\n",sum);
	}
	else
		printf("没有结果");
	return 0;
}
回溯法

#include<stdio.h>
#define n 7
int count=0;
int a[n+1][n+1]={0};
int num;
int sum=0;
int half;
void trace(int t){
	if(t==n){
		if(count==half){
			sum++;
			printf("=====================================\n");
			for(int i=0;i<n;i++){
				for(int j=0;j<n-i;j++){
					if(a[i][j])   
						printf("-");  
					else  
						printf("+"); 
				}
				printf("\n");
			}
		}
		return;
	}
	for(int i=0;i<2;i++){
		a[0][t]=i;
		count+=i;//i为1加1,为0不加,统计1的个数
		for(int j=1;j<=t;j++){
			a[j][t-j]=a[j-1][t-j]^a[j-1][t-j+1];//表示a[0][t]那一条斜线上的
			count+=a[j][t-j];
		}
		if(count<=half&&((t+1)*(t+2)/2-count<=half))
			trace(t+1);
		for(j=1;j<=t;j++){
			count-=a[j][t-j];
		}
		count-=i;
	}
	
}

int main(){
	num=n*(n+1)/2;
	half=num/2;
	if(num%2==0){//如果两个符号个数相同则其总数必为偶数
		trace(0);
		printf("不同的符号三角形的个数为:%d\n",sum);
	}
	else
		printf("没有结果");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值