题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=491
题意就是枚举第一行所有的情况,可以用深搜实现,可根据第一行逐行确定出下一行的状态,,然后算出每种情况两种符号的个数,在运算之前可以先进行一下判断,当(n+1)*n/2为奇数时,结果为零,因为倒置金字塔的符号总数为奇数,两种符号个数不可能相同,参考代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;
#define M 20
int cnt,zcnt,fcnt,res[M];
bool ope[M][M];
void dfs1(int n,int p)
{
if(p == n)
{
zcnt = fcnt = 0;
for(int i = 1;i <= p;++i)
for(int j = 1;j <= p - i + 1;++j)
{
if(ope[i-1][j]) fcnt++;
else zcnt++;
if(j == p - i + 1) continue;
if(ope[i-1][j] == ope[i-1][j+1]) ope[i][j] = false;
else ope[i][j] = true;
}
if(zcnt == fcnt && zcnt) cnt++;
return ;
}
dfs1(n,p+1);
ope[0][p+1] = true;
dfs1(n,p+1);
ope[0][p+1] = false;
}
void init()
{
for(int i = 1;i < 20;++i)
{
memset(ope,0,sizeof(ope));
cnt = 0;
if((i*(i+1)/2)%2==0) dfs1(i,0);
res[i] = cnt;
}
}
int main()
{
int n;init();
while(~scanf("%d",&n))
{
printf("%d\n",res[n]);
}
return 0;
}