5-4 符号三角形问题(回溯)
一、问题描述
下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。
在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。
二、分析
三、代码
//5-4 符号三角形问题
//0+ 1-
#include <iostream>
using namespace std;
int n;//n行,第一行有n个元素
int sum=0;//记录满足题意的数
int half;//n*(n+1)/4
int cnt;//'-'的个数
int p[100][100]; //符号三角形矩阵
void Output(){
cout<<"------------\n";
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i+1;j++){
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
void BackTrack(int t){ //第t行
// cout<<"cnt="<<cnt<<" half="<<half<<endl;
if(cnt>half || (t*(t-1)/2-cnt)>half) return;
if(t>n){
Output();
sum++;
}
else{
for(int i=0;i<=1;i++){
p[1][t] = i;
cnt += i;//'-'的个数
for(int j=2;j<=t;j++){
p[j][t-j+1] = p[j-1][t-j+1] ^ p[j-1][t-j+2];//^相同取0,不同取1
cnt+=p[j][t-j+1];
}
BackTrack(t+1);
for(int j=2;j<=t;j++){
cnt-=p[j][t-j+1];
}
cnt -= i;
}
}
}
int main(){
// cin>>n;
n=7;
half=n*(n+1)/2;//共有n*(n+1)/2个符号
if(half%2==1){ //奇数个符号的话,不存在'+'的个数等于'-'的个数
cout<<"无解\n";
}
else{
half=half/2;
BackTrack(1);
cout<<"sum="<<sum<<endl;
}
return 0;
}
/*
7
*/