符号三角问题

终于到了我最熟悉的回溯法了

#include<iostream>
using namespace std;
int sum=0;//记录答案总个数。
const int n = 7;//第一行一共有多少个符号,n>=2
int triangular_matrix[n][n]{0};//存储符号(+用1表示,-用-1表示)
void solve(int floor,int Count);
void dispose(int index,int Count);//处理第一行
int main()
{
	int Count = 0;
	dispose(0, Count);
	cout << sum << endl;
	return 0;
}

void solve(int floor,int Count)
{
	if (floor == n - 1)
	{
		if (Count == 0)//+与-个数相等
			++sum;
	}
	else if (floor < n - 1)
	{
		int bound = n - floor;
		for (int i = 0; i < bound-1; i++)
		{
			if ((triangular_matrix[floor][i] == 1) && (triangular_matrix[floor][i + 1] == 1)
				|| (triangular_matrix[floor][i] == -1) && (triangular_matrix[floor][i + 1] == -1))
				//相邻的两个同号
			{
				triangular_matrix[floor + 1][i] = 1;
				++Count;
			}
			else//相邻的两个不同号
			{
				triangular_matrix[floor + 1][i] = -1;
				--Count;
			}
		 }
		solve(floor + 1, Count);
	}
	return;
}

void dispose(int index,int Count)
{
	if (index == n)
		solve(0, Count);
	else
	{
		triangular_matrix[0][index] = 1;
		dispose(index + 1, Count+1);
		triangular_matrix[0][index] = -1;
		dispose(index + 1, Count-1);
	}
	return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值