#include <stdio.h> #include <string.h> #define maxn 20 int n,half,count; int p[maxn][maxn]; long sum; //递归方式 void output(int i){ //打印数字三角形第i层 if(i > n){ return; } else{ int j; for(j = 0;j < i - 1;j++) printf(" "); for(j = 1;j < n + 1 - i;j++) printf("%c ",p[i][j] ? '-' : '+'); printf("%c/n",p[i][n + 1 - i] ? '-' : '+'); output(i + 1); } } /* //非递归方式 void output(){ for(int i = 1;i <= n;i++){ for(int j =1;j <= n + 1 - i;j++) printf("%c",p[i][j] ? '-' : '+'); printf("/n"); } printf("/n"); } */ //0-'+' 1-'-' //解向量:用n元组x[1:n]表示符号三角形的第一行 //可行性约束:当前符号三角形所包含的'+'与'-'均不超过n*(n+1)/4 //无解的判断:n(n+1)/2为奇数 void backtrack(int t){ //搜索第t层子树,处理第一行第t个位置 if(count > half || (t * (t - 1) / 2 - count > half)) return ; if(t > n){ sum++; output(1); } else for(int i = 0;i <= 1;i++){ p[1][t] = i; count += i; for(int j = 2;j <= t;j++){ p[j][t - j + 1] = p[j - 1][t - j + 1] ^ p[j - 1][t - j + 2]; count += p[j][t - j + 1]; } backtrack(t + 1); for(int k = 2;k <= t;k++) count -= p[k][t - k + 1]; count -= i; } } int main(){ while(1){ sum = count = 0; memset(p,0,sizeof(p)); scanf("%d",&n); half = n * (n + 1) / 2; if(half % 2){ printf("illegality/n"); } else{ half /= 2; backtrack(1); printf("%d/n",sum); } } return 0; }