1. 程式人生 > >符號三角形

符號三角形

return break bre print desc ostream rip esp 省賽

符號三角形的 第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; }

符號三角形