题目介绍
符号三角形一行有n个符号,该问题要计算有多少个不同的符号三角形使其加号与减号数量相同
代码
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n;//记录三角行数
int a[N][N];//画出三角,0表示-号,1表示加号
int count1;//记录当前加号个数
int sum;//统计三角形个数
int half;//符号总数的一半
void backtrack(int u){//显然是排列树问题
if((count1>half)||n*(n+1)/4-count1>half) return ;//约束性条件:加号或者减号的个数不能超过符号总数的一半
if(u>n){
sum++;
return;
} // 此时到达叶结点
else {
for(int i=0;i<=1;i++){
a[1][u]=i;//遍历斜边
count1+=i;//将第一个点加入矩阵
for(int j=2;j<=u;j++){//遍历每一行
a[j][u-j+1]=a[j-1][u-j+1]^a[j-1][u-j+2];//遍历每一个斜边,上面两个符号相同时产生减号,不同时产生加号
count1+=a[j][u-j+1];
}
backtrack(u+1);//遍历下一个斜边
for(int j=2;j<=u;j++){
count1-=a[j][u-j+1];
}//回溯
}
}
return ;
}
int main(){
cin>>n;
half=n*(n+1)/4;
backtrack(1);//说明该三角形为倒三角
if((n*(n+1)/2)&1) cout<<"impossible";//当符号总数为奇数时,显然不能实现加号与减号个数相同
else cout<<sum;
return 0;
}