幸运三角形

来源:互联网 发布:淘宝贷款如何开通 编辑:程序博客网 时间:2024/05/19 13:19

幸运三角形

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

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

                                           

如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).

输入
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
输出
输出相应的幸运三角形个数。
样例输入
34
样例输出
46
来源
原创
一直搞不懂深搜,好不容易自己写出来一到深搜的题,超兴奋!结果华丽丽的超时...

先把第一行可能的情况全部搜出来即可,后面可根据第一行来判断

超时代码

#include<stdio.h>#include<string.h>char map[25][25];int count1, count2, flag;int n;void fun(int x, int y){//在第一行确定的情况下确定接下来每行的字符 for(int k = 0; k < n-1; k++){for(int i = 0; i < n-k-1; i++){if(map[k][i] == map[k][i+1]){map[k+1][i] = '+';x++;}else{map[k+1][i] = '-';y++;}}}if(x==y){flag++; //幸运三角形的个数 }}void dfs(int m){if(m == n) {fun(count1, count2);return;}for(int i = 0; i < 2;i++){if(i&1){map[0][m] = '+';count1++;dfs(m+1);count1--; //第一行'+'个数 }else{map[0][m] = '-';count2++; //第一行'-'个数 dfs(m+1);count2--;}}}int main(){while(scanf("%d", &n) != EOF){count1 = count2 = 0;flag= 0;if((1+n)*n%2 == 1 || n== 0){  //总数为奇数不可能为幸运三角形 printf("0\n");}else{dfs(0);printf("%d\n", flag);}}return 0;}

根据上面代码求出每一个可能的值,然后打表

#include<stdio.h>#include<string.h>int a[25]= {0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984};int main(){int n;while(scanf("%d", &n) != EOF){printf("%d\n",a[n]);}return 0;}



原创粉丝点击