您的位置:首页 > 其它

符号三角形问题

2017-01-24 18:14 204 查看
下图所示的三角形中,有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  暴力 回溯