符号三角形

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

Input每行1个正整数n <=24,n=0退出.
Outputn和符号三角形的个数.
Sample Input
15
16
19
20
0
Sample 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;
}

 

posted @ 2017-07-25 20:08  X_1996  阅读(410)  评论(0编辑  收藏  举报