符号三角形之回溯算法

题目: 下面都是“-”。 下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。 

+   +   -   +   -   +   +

   +   -   -   -   -   +

     -   +   +   +   -

       -   +   +   -

         -   +   -

           -   -

             +

在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。


#include<stdio.h>
#define max 100
 
int arr[max][max];
int n;
int sum[2];
int half;
int ans_sum;
 
void print()
{
	int i,j,k,l;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n-i+1;j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
}

void BackTrack(int level)
{
	if(sum[0]>half||sum[1]>half)
		return;
	if(level==n+1)
	{
		if(sum[0]==sum[1]&&((sum[1]+sum[0])==n*(n+1)/2))
		{
			print();
			ans_sum++;
		}	
	}
	else
	{
		int i,j,k,l;
		for(i=0;i<2;i++)
		{
			arr[1][level] = i;
			sum[i]++;
			for(j=2;j<=level;j++)//递推子树 
			{
				arr[j][level-j+1] = !(arr[j-1][level-j+1] ^ arr[j-1][level-j+2]);
				sum[arr[j][level-j+1]]++;
			}
			BackTrack(level+1);
			for(j=2;j<=level;j++)//回溯时取消上一次的赋值 
			{
				sum[arr[j][level-j+1]]--;
			}
			sum[i]--;
		}
	}
}
 
int main(void)
{
	printf("请输入符号三角形第一行符号的个数n:");
	scanf("%d",&n); 
	half = n*(n+1)/4;
	if(n*(n+1) /2 % 2 == 1)
	{
		printf("No answer!\n");
		return 0;
	}
	ans_sum = 0;
	BackTrack(1);
	if(ans_sum==0)
		printf("No answer!\n");	
	else 
	    printf("满足要求的符号三角形总共有%d个",ans_sum);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_40685275/article/details/80958070