符号三角形问题-回溯

符号三角形问题

题目介绍

符号三角形一行有n个符号,该问题要计算有多少个不同的符号三角形使其加号与减号数量相同

代码

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n;//记录三角行数
int a[N][N];//画出三角,0表示-号,1表示加号
int count1;//记录当前加号个数
int sum;//统计三角形个数
int half;//符号总数的一半
void backtrack(int u){//显然是排列树问题
	if((count1>half)||n*(n+1)/4-count1>half)   return ;//约束性条件:加号或者减号的个数不能超过符号总数的一半
    if(u>n){
	sum++;
	return;
	} // 此时到达叶结点
	else {
	    for(int i=0;i<=1;i++){
	    	a[1][u]=i;//遍历斜边
	    	count1+=i;//将第一个点加入矩阵
	    	for(int j=2;j<=u;j++){//遍历每一行
	    	      a[j][u-j+1]=a[j-1][u-j+1]^a[j-1][u-j+2];//遍历每一个斜边,上面两个符号相同时产生减号,不同时产生加号
	    	      count1+=a[j][u-j+1];
	    		
	    	}
	        backtrack(u+1);//遍历下一个斜边
	    	for(int j=2;j<=u;j++){
	    		count1-=a[j][u-j+1];
	    	}//回溯
	    }
  }
  return ;
}

int main(){
	cin>>n;
	half=n*(n+1)/4;
	backtrack(1);//说明该三角形为倒三角
	if((n*(n+1)/2)&1) cout<<"impossible";//当符号总数为奇数时,显然不能实现加号与减号个数相同
	else cout<<sum;
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值