幸运三角形
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):
如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).
-
输入
-
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
输出
- 输出相应的幸运三角形个数。 样例输入
-
3 4
样例输出
-
4 6
来源
- 原创
-
有多组测试数据(少于20组)。
先把第一行可能的情况全部搜出来即可,后面可根据第一行来判断
超时代码
#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;
}