NYOJ 491 幸运三角形

幸运三角形

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

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

                                  

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

中的图(2).

         

 
输入
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
输出
输出相应的幸运三角形个数。
样例输入
3

4

样例输出
4

6

来源
原创
上传者
ACM_杨延玺


解题思路:我是用最笨的方法啦!打表。把题目中倒着的三角形顺着看。当前位置的放置只跟当前位置的左边的和上边的左边的决定,因此只要枚举每一层最左边的符号就可以了。

NYOJ 491 幸运三角形
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <cstdlib>

 5 #include <vector>

 6 #include <climits>

 7 #include <algorithm>

 8 #include <cmath>

 9 #define LL long long

10 using namespace std;

11 bool tri[21][21];

12 int ans[21],cnt = 0;

13 void dfs(int n) {

14     if(n > 20) return;

15     for(int k = 0; k < 2; k++) {

16         tri[n][0] = k;

17         cnt += tri[n][0];

18         for(int i = 1; i < n; i++) {

19             tri[n][i] = tri[n-1][i-1]?tri[n][i-1]:!tri[n][i-1];

20             cnt += tri[n][i];

21         }

22         if((cnt<<1) == (n*(n+1)>>1)) ans[n]++;

23         dfs(n+1);

24         for(int i = 0; i < n; i++)

25             cnt -= tri[n][i];

26     }

27 }

28 int main() {

29     int n;

30     dfs(1);

31     while(~scanf("%d",&n)) printf("%d\n",ans[n]);

32     return 0;

33 }
View Code

 

你可能感兴趣的:(OJ)