幸运三角形 南阳acm491(dfs)

幸运三角形

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述

        话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):

                                           

如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).

 
输入
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
输出
输出相应的幸运三角形个数。
样例输入
3
4
样例输出
4
6
来源
原创
上传者
ACM_杨延玺
算法思想:把+看成1,把-看成0,具体看代码实现
 1 #include<stdio.h>
 2 int b[25][25];
 3 int n,ans;
 4 void dfs(int z,int x,int y)    //x = 0(表示'-'),y = 1(表示'+'),
 5 {
 6     int x1,y1;
 7     if(z == n)
 8     {
 9         if(x == y)
10         {
11             ans++;
12             return;
13         }
14         return;
15     }
16     for(int k=0; k<=1; k++)
17     {
18         x1 = x,y1 = y;
19         b[0][z] = k;    //用来存储三角形第一行
20         b[0][z]>0 ? y1++ : x1++;
21         for(int i=1,j=z-1; j>=0; i++,j--)    //用来判断上一行相邻数
22         {
23             b[i][j] = b[i-1][j] ^ b[i-1][j+1];    //(1^0 || 0^1 == 0); (1^1 || 0^0 == 1)
24             b[i][j]>0 ? y1++ : x1++;
25         }
26         dfs(z+1,x1,y1);
27     }
28 }
29 int main()
30 {
31     int a[25];
32     a[0] = 0;
33     for(int i=1; i<=20; i++)    //a[25]用来存储n三角形为偶数还是奇数
34         a[i] = (a[i-1]+i);
35     while(scanf("%d",&n)!=EOF)
36     {
37         ans = 0;
38         if(a[n]%2 == 0)    //为偶数时才可能有幸运三角形
39             dfs(0,0,0);
40         printf("%d\n",ans);
41     }
42     return 0;
43 }

 

posted @ 2018-07-25 11:20  ˇskyblue  阅读(205)  评论(0)    收藏  举报