符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
Input每行1个正整数n <=24,n=0退出.
Outputn和符号三角形的个数.
Sample Input
15 16 19 20 0Sample Output
15 1896 16 5160 19 32757 20 59984这个题蓝桥杯省赛好像遇到过,说起蓝桥杯就心塞,连续两年都去北京打了酱油23333这题 n<=24 ,直接打表,把1-24的情况直接打出来,然后输出就行了。因为每一行都是根据上面一行得到的,所以把第一行的所有情况都枚举出来,分别计算是否符合要求。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
int m[30][30];
int s,f,t;
void bfs(int i)
{
if(i==0)
{
int s1=0,s2=0;
for(int j=1;j<=t;j++)
{
if(m[0][j]==1)
s1++;
else
s2++;
}
for(int j=1;j<t;j++)
{
for(int l=1;l<=t-j;l++)
{
if(m[j-1][l]==m[j-1][l+1])
{
m[j][l]=1;
s1++;
}
else
{
m[j][l]=0;
s2++;
}
if(s1>s||s2>s)
return;
}
}
if(s1==s2)
f++;
return;
}
m[0][i]=0;
bfs(i-1);
m[0][i]=1;
bfs(i-1);
}
int main()
{
int a[25]={0};
for(int i=1;i<=24;i++)
{
if(i*(i+1)%4==0)
a[i]=-1;
}
/* a[3]=4;
a[4]=6;
a[7]=12;
a[8]=40;
a[11]=171;
a[12]=410;
a[15]=1896;
a[16]=5160;
a[19]=32757;
a[20]=59984;
a[23]=431095;
a[24]=822229;*/
int n;
/* while(1)
{
scanf("%d",&n);
if(n==0)
break;
printf("%d %d\n",n,a[n]);
}*/
for(int i=1;i<=24;i++)
{
if(a[i]==-1)
{
printf("%d ",i);
f=0;
s=i*(i+1)/4;
t=i;
memset(m,-1,sizeof(m));
bfs(i);
printf("%d\n",f);
}
}
return 0;
}
来源:https://www.cnblogs.com/xzxj/p/7236206.html