话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):

如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).
这道题 我吓哭了 我首先用的dfs 可是 我不输出换行 就提示崩溃 木马。。
可能我小白把。。对这个也不清楚。。就是木马
你看看 有知道的请告知一下。。。。
所以我就用上了换行 然后打表了,把结果在纸上记下来,虽然我19就运行了5分钟。。(我只运行了前19个)不过20应该在30分钟内能运行出来把
耐心等待。。。
#include<stdio.h>
int n,sum,sum1,sum2;
int b[21],c[21];
bool judge(int m)
{
for(int i=0;i<m;i++)
{
if(c[i]==0)
sum1++;
if(c[i]==1)
sum2++;
if(c[i]==c[i+1])
c[i]=1;
else
c[i]=0;
}
printf("\n");//就是这里 不换行就TM木马。。程序崩溃 吓哭了。。哪里会导致木马
if(m!=0)
judge(m-1);//共m层,计算全部
if(sum1==sum2)
return true;
else
return false;
}
void dfs(int star,int end)
{
if(star==end)
{
for(int i=0;i<n;i++)//
c[i]=b[i];
sum1=sum2=0;
if(judge(n))
sum++;
return ;
}
b[star]=0;//0表示-
dfs(star+1,end);
b[star]=1;//1表示+
dfs(star+1,end);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n*(1+n)/2%2)
printf("0\n");
else
{
sum=0;
dfs(0,n);
printf("%d\n",sum);//把结果在纸上记下来
}
}
return 0;
}#include <stdio.h>
int main()
{
int a[21]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984};
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",a[n]);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
nyoj 491 幸运三角形 (dfs + 打表 出现木马 哈哈)
原文地址:http://blog.csdn.net/su20145104009/article/details/47101267