符号三角形-回溯算法-C++

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

题目描述:符号三角问题:下图是由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;
	
}

示例输入输出:
在这里插入图片描述
学习中,欢迎交流

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值