符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:
输入格式:
一个整数n(n<12)。
输出格式:
解的个数。
输入样例:
7
输出样例:
12
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> > ans;
vector<int> path;
int N;
void backtacking(){
if (path.size() == N) {
ans.push_back(path);
return;
}
for (int i = 0; i <= 1; i++) {
path.push_back(i);
backtacking();
path.pop_back();
}
}
int main(){
int count = 0;
cin >> N;
backtacking();
for (int i = 0; i < ans.size(); i++) {
int array[N][N];//将每一次的可行解建立一个二维矩阵
memset(array, -1, sizeof(array));//初始化为-1;
for (int j = 0; j < N; j++) {
array[0][j] = ans[i][j];
}
for (int k1 = 1; k1 < N; k1++) {
for (int k2 = 0; k2 < N - k1; k2++) {// N - k1 :因为这里是逐层递减的
if (array[k1-1][k2] == array[k1-1][k2+1]) { //上一行的符号相同
array[k1][k2] = 0; //这里我们用0和1代表'+'和'-'
}else{
array[k1][k2] = 1;
}
}
}
int cnt1 = 0;
int cnt2 = 0;
for (int k3 = 0; k3 < N; k3++) {
for (int k4 = 0; k4 < N; k4++) {
if (array[k3][k4] == 0) {
cnt1++;
}
if (array[k3][k4] == 1){
cnt2++;
}
// cout << array[k3][k4] << ' ';
}
// cout << endl;
}
if (cnt1 == cnt2) {
count++;
}
// cout << endl;
}
cout << count;
}