题目描述:符号三角问题:下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。

在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。(参考计算机算法设计与分析第五版-王晓东)
代码如下:
#include<iostream>
#include<string>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int sum = 0, n, ret = 0, half;//sum为-号的数量,n为第一排符号数,count为满足条件三角形个数,half为符号的总数量
int s[500][500];
void Solve(int t, int sum)
{
if (sum > half || t * (t - 1)/2 - sum > half)//加号和减号的值超过总符号数的一半不满足条件,剪枝
return;
if (t > n)
{
ret++;
return;
}
for (int i = 0; i < 2; i++) {//i填入的0,1符号
s[1][t] = i;
for (int j = 2; j <= t; j++)
{
s[j][t - j + 1] = s[j - 1][t - j + 1] ^ s[j - 1][t - j + 2];//用0,1表示的一个好处是可以使用异或运算,来计算下层结果
sum += s[j][t - j + 1];
}
Solve(t + 1, sum + i);
for (int j = 2; j <= t; j++)//撤销之前操作,以便进行下一种排列
sum -= s[j][t - j + 1];
}
}
int main()
{
cout << "请输入第一排符号数n:" << endl;
cin >> n;
half = n * (n + 1) / 2;
memset(s, 0, sizeof(s));//初始化s数组,本题用0代表+,1代表-;
if (half % 2 != 0)
cout << 0 << endl;
else
{
half = half / 2;//half,改为两种符号各占数量
Solve(1, 0);
cout << "满足条件三角形的个数为:" << endl;
cout << ret << endl;
}
system("PAUSE");
return 0;
}
示例输入输出:

学习中,欢迎交流
本文探讨了符号三角问题,即给定第一行符号数n,计算由等数目的'+'和'-'组成的符号三角形数量。通过递归算法实现,利用异或运算简化计算过程,最终输出满足条件的三角形个数。
576





