符号三角形问题(dfs)

  • Post author:
  • Post category:其他


符号三角形




Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1800    Accepted Submission(s): 930







Problem Description
符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:

+ + – + – + +

+ – – – – +

– + + + –

– + + –

– + –

– –

+


Input
每行1个正整数n <=24,n=0退出.


Output
n和符号三角形的个数.


Sample Input
  
  
15 16 19 20 0


Sample Output
  
  
15 1896 16 5160 19 32757 20 59984

分析:dfs代码超时,数据较小,可以打表过,之后再贴优化代码

代码如下:

#include <stdio.h>
int N;
int count=0;
int a[1005][1005];

int judge()
{
	int i,j;
	long long n=0,m=0;
	for(j=0;j<N;j++)
	{//统计第一行的正负个数 
		if(a[0][j])
			n++;
		else
			m++;
	}
		
	for(i=1;i<N;i++)
	{
		for(j=0;j<N-i;j++)
		{//统计其他行的正负个数 
			a[i][j]=!(a[i-1][j]^a[i-1][j+1]);
			if(a[i][j])
				n++;
			else
				m++;
		}
	}
	if(n==m)
		return 1;
	else
		return 0;
}

void dfs(int t)
{//t代表层数,a代表加号个数,b代表减号个数 ,index代表上一层是+还是- 
	if(t==N)
	{
		if(judge())
			count++;
		return ;
	}
	//负号 
	a[0][t]=0;
	dfs(t+1);
	
	//正号 
	a[0][t]=1;
	dfs(t+1);
}

int main()
{
	while(scanf("%d",&N),N)
	{
		count=0;
		dfs(0);
		printf("%d\n",count);
	}
	return 0;
}



版权声明:本文为llwwlql原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。