Problem Z
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 3 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
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 3275720 59984
思路 打表题:将+,-看成1,0。然后全排列。因为得到下面的只需要得到第一行就行,所以我们对第一行全排列然后求出用fun 求出下面的然后统计+,-的个数,最后相同计数器就加1。然后从1求到24全都求出来就行了。
#include<stdio.h> #include<string.h> #include<stdlib.h> int n; int a[50]; int count; int b[50]; int fun(int n,int count1,int count2) { if(n==0) { if(count1==count2) return 1; return 0; } int i=1; for(;i<n;i++) { if(b[i]==0) count1++; else count2++; if(b[i]==b[i+1]) b[i]=0; else b[i]=1; } if(b[i]==0) count1++; else count2++; return fun(n-1,count1,count2); } int dfs(int count1) { if(count1==n+1) { for(int i=1;i<=n;i++) { b[i]=a[i]; } if(fun(n,0,0)) count++; return 1; } a[count1]=0; dfs(count1+1); a[count1]=1; dfs(count1+1); } int main() { int d[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 n; while(scanf("%d",&n)&&n) printf("%d %d\n",n,d[n]); }