话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有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