符号三角形问题

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

      +

//暴力
#include<stdio.h>
#include<math.h>
int main(){
	int n;//第一行有几个数 
	int num,temp;
	int i,j,k;
	int sum;
	int count = 0;
	char ch[] = {'+','-'};//0表示+,1表示-
	int **a; 
	scanf("%d",&n);
	if((n * (n + 1)) % 4 != 0){//这里为了保证让+和-的个数相同,所以必须要求 (n * (n + 1)) / 2为偶数 
		printf("输入有误!");
		return 0; 
	}
	//动态申请空间 
	a = new int*[n];
	for(i = 0;i < n;i ++){
		a[i] = new int[n];
	}
	for(int num = 0;num < pow(2,n);num ++){
		sum = 0;
		temp = num;
		for(i = 0;i < n;i ++){
			a[0][i] = temp % 2;
			temp /= 2; 
		}
		for(i = 1;i < n;i ++){
			for(j = 0;j < n - i;j ++){
				a[i][j] = a[i - 1][j] ^ a[i - 1][j + 1];
			}
		}
		for(i = 0;i < n;i ++){
			for(j = 0;j < n - i;j ++){
				sum += a[i][j]; 
			}
		}
		if(sum * 2 == n * (n + 1) / 2){
			count ++;
			printf("********%d********\n",count);
			for(i = 0;i < n;i ++){
				for(j = 0;j < n - i;j ++){
					printf("%c",ch[a[i][j]]);
				}
				putchar('\n');
			}
		}
	}
	printf("the number is %d.",count);
	return 0;
} 
========================================================================================
//回溯
#include<stdio.h>
int n;//第一行有几个数 
int sum = 0;
int count = 0;
char ch[] = {'+','-'};//0表示+,1表示-
int **a;
int half;
void nfs(int t)
{
	int i,j;
	if(t == n){
		if(sum * 2 == n * (n + 1) / 2){
			count ++;
			printf("********%d********\n",count);
			for(i = 0;i < n;i ++){
				for(j = 0;j < n - i;j ++){
					printf("%c",ch[a[i][j]]);
				}
				putchar('\n');
			}
		}
		return;
	}
	for(i = 0;i < 2;i ++){//两次循环表示分别走左右分支 
		a[0][t] = i;
		sum += i;
		for(j = 1;j <= t;j ++){//第一行每增加一个数,从第1~t行的末尾每行也会增加一个数 
			a[j][t - j] = a[j - 1][t - j] ^ a[j - 1][t - j + 1];
			sum += a[j][t - j];	 
		}
		if(sum <= half && ((t + 1) * (t + 2) / 2 - sum)<= half){
			nfs(t + 1);
			for(j = 1;j <= t;j ++){//第一行每增加一个数,从第1~t行的末尾每行也会增加一个数 
				sum -= a[j][t - j];	 
			}
			sum -= i;	
		}
		
	}
}
int main(){
	int i;
	scanf("%d",&n);
	half = n * (n + 1) / 2;
	if((n * (n + 1)) % 4 != 0){//这里为了保证让+和-的个数相同,所以必须要求 (n * (n + 1)) / 2为偶数 
		printf("输入有误!");
		return 0; 
	}
	//动态申请空间 
	a = new int*[n];
	for(i = 0;i < n;i ++){
		a[i] = new int[n];
	}
	nfs(0);
	printf("the number is %d.",count);
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值