下图所示的三角形中,有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;
}