幸运三角形
时间限制: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 }