符号三角形 回溯法
关于问题的不再描述。
输入和输出如图所示。
#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");
}
}
int is_equal(int number1,int number2)
{
if(number1==number2)
return 1;
else
return 0;
}
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++)
{
if(is_equal(arr[j-1][level-j+1],arr[j-1][level-j+2]))
k = 1;
else
k = 0;
arr[j][level-j+1] = k;
sum[k]++;
}
BackTrack(level+1);
for(j=2;j<=level;j++)
{
sum[arr[j][level-j+1]]--;
}
sum[i]--;
}
}
}
int main()
{
printf("Input n:");
while(scanf("%d",&n)!=EOF)
{
half = n*(n+1)/4;
ans_sum = 0;
BackTrack(1);
if(ans_sum==0)
printf("No answer!\n");
printf("Input n:");
}
return 0;
}