zoukankan      html  css  js  c++  java
  • 符号三角形问题

    符号三角问题+”和-”组成的符号三角形。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));
           }
    }

  • 相关阅读:
    ajax遇到的问题
    Javascript事件传播(冒泡机制) (摘自 博客园 萍水相逢)
    学习的一点体悟和衷告
    localStorag的一点见解
    感谢!
    文件上传的一些方法
    form:form的一点体会
    鼠标事件大汇总
    readonly和disabled的异同
    说说icon图标
  • 原文地址:https://www.cnblogs.com/ljs-666/p/7923250.html
Copyright © 2011-2022 走看看