幸运三角形
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):
如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).
-
输入
-
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
输出
- 输出相应的幸运三角形个数。 样例输入
-
3 4
样例输出
-
4 6
思路: 用dfs来构造第一层,然后由上一层一次推出下一层。。。找出0<n<20的所有结果,然后打表输出。
代码:
#include<stdio.h> #include<string.h> char str[25]; char ans[25]; bool vis[25]; int count; int n; void caculate(int t) { int suma,sumb; suma=0;sumb=0; strcpy(str,ans); while(t) { for(int i=0;i<t;i++) { if(str[i]=='+') suma++; if(str[i]=='-') sumb++; } // for(int i=0;i<t;i++)printf("%c",str[i]); // printf(" \nsuma=%d sumb=%d\n",suma,sumb); for(int i=0;i<t;i++) { if(str[i]==str[i+1]) str[i]='+'; else str[i]='-'; } t--; } if(suma==sumb&&suma!=0) count++; } void dfs(int num)//构造第一层 { if(num==n) { // printf("ans= %s\n",ans); caculate(n);//计算+,- return ; } if(!vis[num]) { vis[num]=true; ans[num]='+'; dfs(num+1); ans[num]='-'; dfs(num+1); vis[num]=false; } } int main() { //while(~scanf("%d",&n)) for(int i=0;i<20;i++) { n=i; memset(vis,false,sizeof(vis)); count=0; dfs(0); printf("%d,",count); } }
#include<stdio.h> int main() { int n; int ans[]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757}; while(~scanf("%d",&n)) { printf("%d\n",ans[n]); } }
-
有多组测试数据(少于20组)。