问题 L: 幸运三角形
时间限制: 1 Sec 内存限制: 64 MB提交: 12 解决: 9
[ 提交][ 状态][ 讨论版]
题目描述
话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):
如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).
输入
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
每行含一个整数n(0<n<20)。
输出
输出当图形的最上层有n个符号时相应的幸运三角形个数。
样例输入
3
4
样例输出
4
6
//用0,1来代替+,-;
#include<stdio.h>
int mat[25][25];
int x;//记录0值
int y;//记录1值
int sum;
int n;
void dfs(int k,int q,int p){
int x,y;
if(k==n){
if(q==p)
sum++;
return;
}
for(int t=0;t<2;t++ ){
x=q;y=p;mat[0][k]=t;
t?y++:x++;
for(int i=1,j=k-1;j>=0;i++,j--){
mat[i][j]=mat[i-1][j]^mat[i-1][j+1];//二进制运算 异或
mat[i][j]?y++:x++;
}
dfs(k+1,x,y);
}
}
int main()
{
while(~scanf("%d",&n)){
sum=0;
if(n*(n+1)/2%2==0)//三角形符号总数为偶数才可能—,+数目相等
dfs(0,0,0);
printf("%d\n",sum);
}
return 0;
}