字符三角形问题
问题描述:
符号三角问题:下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。
解题思路:
一个符号三角形最终是否有相同数量的+ - 只取决于第一行中+ - 全排列。故对第一行n个数 0 1 枚举子集,在向下统计时可适当剪枝
解题代码
/*
* @Author: Achan
* @Date: 2019-12-23 20:16:09
* @Last Modified by: Achan
* @Last Modified time: 2019-12-23 22:03:28
*/
#include<iostream>
using namespace std;
const int maxn = 1e3 + 5;
int total;
int ans;
bool a[maxn][maxn];
int calculate(int n)
{
int ret = 0;
int opp = 0;
for(int i = 1; i < n; i++)``
{
for(int j = 1; j <= n - i + 1; j++)
{
ret += a[i][j];
opp += (!a[i][j]);
if(ret > total/2 || opp > total/2) return -1; //剪枝
}
for(int j = 1; j <= n - i; j++)
{
a[i+1][j] = (a[i][j] ^ a[i][j+1]);
}
}
return ret + a[n][1];
}
void solve(int cur,int n)
{
if(cur == n + 1){
int sum = calculate(n);
ans += (total/2 == sum);
//输入满足条件的字符三角形
if(total/2 == sum)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n - i + 1;j++)
cout << (a[i][j]?"-":"+") << ((j - n + i - 1)?" ":"\n");
return;
}
for(int i = 0 ; i < 2; i++)
{
a[1][cur] = i;
solve(cur + 1, n);
}
}
int main(void){
int n;
cin >> n; //请输入n个字符
total = n * ( n + 1) / 2;
ans = 0;
solve(1,n);
cout << ans << endl;
return 0;
}