符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:
+ + - + - + ++ - - - - +
- + + + -
- + + -
- + -
- -
+
Input
每行1个正整数n <=24,n=0退出.
Output
n和符号三角形的个数.
Sample Input15
16
19
20
0
Sample Output
15 1896
16 5160
19 32757
20 59984
只需要枚举第一行的状态下面的状态利用^运算即可。与POJ某题点灯题类似。但是无论如何剪枝都会超时,上网看了题解发现都是先输出数据保存起来直接打表(因为数据太小了)。
#include <stdio.h>
#include <math.h>
#include <string.h>
int value[25],book[25]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229},cut,flag;
void dfs(int k,int t)
{
int i;
if (k==t){
cut=0;
for (i=0;i<t;i++){
cut+=value[i];
}
while (t--){
for (i=0;i<t;i++){
value[i]=value[i+1]^value[i];
cut+=value[i];
}
}
// printf ("%d-%d\n",cut,);
if (cut*2==k+k*(k-1)/2) flag++;
return ;
}
value[k]=1;
dfs(k+1,t);
value[k]=0;
dfs(k+1,t);
}
int main ()
{
int i,j;
/* for (i=1;i<=24;i++){
dfs(0,i);
printf ("%d,",flag);
flag=0;cut=0;
memset(value,0,sizeof(value));
}*/
while (scanf ("%d",&i)&&i){
printf ("%d %d\n",i,book[i]);
}
return 0;
}
上面代码即是先写一个打表程序,再将数据导出记录再
另外写个程序输出即可。这题对于打表有较深的启发意义。