算法 符号三角形问题

来源:互联网 发布:ubuntu 安装 sublime 编辑:程序博客网 时间:2024/05/20 03:07

题目

在符号三角形中,有14个“+“和14个“-”。2个同号下面是+,两个异号下面是-。在一般情况下,符号三角形的第一行有n个符号。
符号三角形问题,要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”相同。

这里写图片描述


分析

回溯法。亦或:同值亦或为0,不同亦或为1。


#include <stdio.h>    #include <math.h>#define n 7 int sum;//不同的符号三角形数int count; //统计 "-"数int half;  int **p;  void dfs(int t){      int i,j;      if( (count>half) || (t*(t-1)/2-count>half) )          return;      if(t>n)         sum++;      else{          for(i=0; i<2; i++){//+ -            p[1][t]=i;//第一层出来,后面就出来了             count+=i;              for(j=2; j<=t; j++){                p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];//上面两个亦或,相同为0,即"+",不相同为1,即"-"                  count+=p[j][t-j+1];//这里每次都加,亦或出0的不影响count值,所以统计的是"-"            }              dfs(t+1);//继续            for(j=2;j<=t;j++)//回去                count+=p[j][t-j+1];            count-=i;          }      }  }  int main(){      int i,j;         sum=0;     count=0;     //对2取余为0才继续    half=(n+1)*n/2;      if(half%2==1){          printf("没有!");          return 0;      }      //初始化二维数组      p=new int *[n+1];      for(i=0; i<n+1; i++)        p[i]=new int[n+1];      for(i=0; i<n+1; i++)          for(j=0;j<n+1;j++)              p[i][j]=0;     dfs(1);      printf("%d\n",sum);    return 0;  }  
0 0