幸运三角形
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):
如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图
-
中的图(2).
-
- 输入
- 有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。 - 输出
- 输出相应的幸运三角形个数。
- 样例输入
-
3 4
- 样例输出
-
4 6
- 来源
- 原创
- 上传者
- ACM_杨延玺
-
解题思路:我是用最笨的方法啦!打表。把题目中倒着的三角形顺着看。当前位置的放置只跟当前位置的左边的和上边的左边的决定,因此只要枚举每一层最左边的符号就可以了。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 ",ans[n]); 32 return 0; 33 }