c++程序:
#include"iostream"
using namespace std ;
//声明一个类
//用回溯法解符号三角形问题时,可以用完全二叉树表示其解空间。
//这个问题是给定的n,计算有多少个符号三角形,使其所含的“+”和"-"的个数相同.
class Triangle {
private :
int n ; //第一行的符号个数
int half ;// n*(n+1)/ 4
int count ; //当前“+”的个数
int p [100] [100] ; //符号三角形矩阵
long sum ; // 已经找到的符号三角形数
public :
//n是第一行的符号个数
long compute(int nn )
{
n = nn ;
count = 0 ;
sum = 0 ;
half = n*( n+1 )/2 ;//符号总数
if(half%2 == 1 )
return 0 ;//对于特定的n,当n*(n+1)/2为奇数时,显然不存在所包含的“+”个数和“-”个数相同的符号三角形,程序直接退出
half = half / 2 ;//符号总数的一半.如果加号或者减号是half的一半,就是要找的三角形。
for(int i =0 ; i < 100 ; i++ )
{
for (int j=0; j<100;j++ )
p [i][j] = 0 ;
}
backtrack (1) ;
return sum ;
}
void backtrack(int t)//这个t相当于二叉树的第几层,从1开始。n是二叉树的深度.当t=n,时说明到了叶子节点的上一层,当t刚大于n时,说明到了