符号三角问题:“+”和“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。
在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。
import java.io.*; import java.util.*; public class Triangles { public static int n,half,count;//第一行的符号个数n,当前“+”个数count, public static int[][] p;//符号三角形矩阵 public static long sum;//符合条件的符号三角形个数 public static long computs(int nn){ n=nn; count=0; sum=0; half=n*(n+1)/2; if (half%2==1)//无解的判断:n*(n+1)/2为奇数 { return 0; } half=half/2; p=new int[n+1][n+1]; for (int i=0;i<n ;i++ )//数组初值 { for (int j=0;j<n ;j++ ) { p[i][j]=0; } } backtrack(1); return sum; } public static void backtrack(int t){ if ((count>half)||(t*(t-1)/2-count>half))return;//若符号统计未超过半数,并且另一种符号也未超过半数 if (t>n)//当i>n时,算法搜索至叶节点,得到一个新的“+”个数与“—”个数相同的符号三角形,当前已找到的符号三角形数sum增1. { sum++; }else{ for(int i=0;i<2;i++){ p[1][t]=i; count+=i; for(int j=2;j<=t;j++){ if(p[j-1][t-j+1]==p[j-1][t-j+2])p[j][t-j+1]=1;//2个同号下面都是“+” else p[j][t-j+1]=0;//2个异号下面都是“-” count+=p[j][t-j+1]; } backtrack(t+1); for(int j=2;j<=t;j++)//回溯时取消上一次的赋值 count-=p[j][t-j+1]; count-=i; } } } public static void main(String[] args) { System.out.println("请输入第一行符号值:"); Scanner read =new Scanner(System.in); int n=read.nextInt(); System.out.println("个数:"+computs(n)); } }