afterward

导航

 

 

列举后直接输出:

View Code
#include<stdio.h>
int res[25]= {0,0,0,4,6,0,0,12,40,0,0,171,410,
              0,0,1896,5160,0,0,32757,59984,0,0,431095,822229
             };
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        printf("%d %d\n",n,res[n]);
    }
    return 0;
}

而这些数字是怎么列举出来的看下面代码。

 将正负号转化为二进制10

i=2 两位

0            0 0

1            0 1

2            1 0

3            1 1

i=3 三位

0         0  0 0

1         0  0 1

2         0  1 0

3         0  1 1

4         1  0 0

5         1  0 1

。。。。。。

 

 

View Code
/**
每个符号三角形都是由它的第一行“+,-”号分布决定的,据此可演算出所有分布的三角形,
对其进行统计即可。
同时将一个n行三角形T的+,-号个数分别记为pos_num(n),neg_num(n),其第一行中的+,-号个数
记为x(n),y(n),则可得到下式:
pos_num(n)=x(n)+pos_num(n-1)
neg_num(n)=y(n)+neg_num(n-1)
由此,我们可以从n=1开始,利用前面n=k-1的结果,迭代求出n=k的分布情形,
然后对n=k的所有分布统计。

*/
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
struct record
{
    int pos,neg;
    record(int a,int b)
    {
        pos=a;
        neg=b;
    }
};
int main()
{
    int n,i,j,k,sum;
    vector<record> v;
    for(int m=1; m<=24; m++)
    {
        n=m;
        //n=4;
        if((n*(n+1))%4!=0)
        {
            cout<<n<<" 0"<<endl;
            continue;
        }
        vector<record> v;
        record r1(0,1);//n=1的情况
        v.push_back(r1);
        record r2(1,0);
        v.push_back(r2);
        for(i=2; i<=n; i++) //计算到n的所有情况
        {
            int * trip=new int[i];
            int sum_i=(int)pow(2.0,i*1.0);
            for(j=0; j<sum_i; j++) //第j种分布
            {
                int temp1=j, temp2=i;
                int x=0,  y=0; //记录+,-的个数
                while(temp1)
                {
                    if(temp1%2==0)
                    {
                        trip[--temp2]=0;
                       // cout<<trip[temp2]<<" ";
                        y++;
                    }
                    else
                    {
                        trip[--temp2]=1;
                        //cout<<trip[temp2]<<" ";
                        x++;
                    }
                    temp1/=2;
                }
                for(k=0; k<temp2; k++)
                    y++,  trip[k]=0;//cout<<trip[k]<<" ";
                  //  cout<<endl;
                int idx=0;
                for(k=0; k<i-1; k++)
                {
                    if(trip[k]+trip[k+1]==1)
                        idx*=2;
                    else   idx*=2,idx+=1;
                }
                x+=v[2*((int)pow(2.0,i-2.0)-1)+idx].pos;
                y+=v[2*((int)pow(2.0,i-2.0)-1)+idx].neg;
                record r(x,y);//cout<<">>>"<<x<<" "<<y<<endl;
                v.push_back(r);
            }

        }
        /**if(n==3){
            int star=2*((int)pow(2.0,n-1.0)-1);
            for(j=0;j<(int)pow(2.0,n*1.0);j++)
                printf("---%d %d\n",v[star+j].pos,v[star+j].neg);
        }*/
        int base=2*((int)pow(2.0,n-1.0)-1);
        int num=(int)pow(2.0,n*1.0);
        sum=0;
        for(i=0; i<num; i++)
        {
            if(v[base+i].pos==v[base+i].neg)
                sum++;
        }
        cout<<n<<" "<<sum<<endl;
   // }
    return 0;
}

 

符号三角形
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 477    Accepted Submission(s): 237


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

 

Input
每行1个正整数n <=24,n=0退出.

 

Output
n和符号三角形的个数.

 

Sample Input
15
16
19
20
0
 

Sample Output
15 1896
16 5160
19 32757
20 59984

posted on 2012-08-23 11:01  afterward  阅读(297)  评论(0编辑  收藏  举报