符號三角形問題

iamzxf發表於2014-11-12
     下圖所示的三角形中,有14個“+“和14個“-”。2個同號下面是+,兩個異號下面是-。

+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+

    在一般情況下,符號三角形的第一行有n個符號。符號三角形問題,要求對於給定的n,計算有多少個不同的符號三角形,使其所含的“+”和“-”相同。

利用回溯法,參考程式碼如下:
#include <stdio.h>
int sum,count;
int half;
int **p;
int n;

void backtrack(int t)
{
	int i,j;
	if((count>half)||(t*(t-1)/2-count>half))
		return;
	if(t>n) sum++;
	else
	{
		for(i=0;i<2;i++)
		{
			p[1][t]=i;
			count=count+i;
			for(j=2;j<=t;j++)
			{
				p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];
				count+=p[j][t-j+1];
			}
			backtrack(t+1);
			for(j=2;j<=t;j++)
				count+=p[j][t-j+1];
			
			count-=i;
		}
	}
}


int main()
{

	int i,j;	
	printf("input the number of symbols in the first line:");
	scanf("%d",&n);
	
	count=0; sum=0;
	half=(n+1)*n/2;

	if(half%2==1)
	{
		printf("the number is 0");
		return 0;
	}
	
	p=new int *[n+1];

	for(i=0;i<n+1;i++)
		p[i]=new int[n+1];

	for(i=0;i<n+1;i++)
		for(j=0;j<n+1;j++)
			p[i][j]=0;

	backtrack(1);

	printf("the result is %d.\n",sum);
	
	return 0;
}

帶輸出結果的:
#include <stdio.h>
#include <math.h>

int n,count=0,half,sum=0;
int **a;


void backtrack(int t)
{
	if(count>half || (t*(t+1)/2-count>half)) return;
	int i,j;
	if(t==n){	
		sum++;
		for(i=0;i<n;i++)
		{
			for(j=0;j<n-i;j++)
			{
				if(a[i][j])	
					printf("-");
				else
					printf("+");
			}
			printf("\n");
		}
		printf("=====================\n");
	}
	else{
		for(i=0;i<2;i++){
			a[0][t]=i;
			count=count+i;

			for(j=1;j<=t;j++){
				a[j][t-j]=a[j-1][t-j]^a[j-1][t-j+1];
				count+=a[j][t-j];
			}

			backtrack(t+1);

			for(j=1;j<=t;j++){				
				count-=a[j][t-j];
			}
			count=count-i;
		}
	}
}


int main()
{
	int i,j,k;
	scanf("%d",&n);
	if((n*(n+1)/2)%2==1)
	{
		printf("result is 0.\n");
		return 0;
	}

	half=n*(n+1)/4;
	a=new int*[n];

	for(i=0;i<n;i++)
		a[i]=new int [n];

	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			a[i][j]=0;
	}

	backtrack(0);

	printf("the result is %d.\n",sum);

	return 0;
}








相關文章