• HDU2510 符号三角形 DFS直接打表


    Problem Description
     
    符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:
    + + - + - + + 
    + - - - - + 
    - + + + - 
    - + + - 
    - + - 
    - - 
    +
     
    Input
    每行1个正整数n <=24,n=0退出.
     
    Output
    n和符号三角形的个数. 
     
    Sample Input
    15
    16
    19
    20
    0
     
    Sample Output
    15 1896
    16 5160
    19 32757
    20 59984

     

    这道题本来是尝试找规律的,找了4个,发现应该是没有规律的,网上看了一下, 说是可以打表,哈哈,打表的题目我还没有做过,就做了,挺好玩的。

    打表,就是DFS (或其他方式) 找出所有情况,看哪些情况符合题意的要求,就记录下来,用一个数组存储,然后在程序中直接就把数组写上去了,挺爽的。

    我的打表程序:

     1 #include<cstdio>
     2 #include<cstring>
     3 const int maxn=28;
     4 int a[maxn][maxn];
     5 int n;
     6 int ans,add,sub;
     7 void DFS(int cnt)
     8 {
     9     if(cnt==n+1)
    10     {
    11         for(int i=n-1;i>0;i--)
    12         {
    13             for(int j=1;j<=i;j++)
    14             {
    15                 a[i][j]=a[i+1][j]^a[i+1][j+1];
    16             }
    17         }
    18         sub=add=0;
    19         for(int i=1;i<=n;i++)
    20         {
    21             for(int j=1;j<=i;j++)
    22                 if(a[i][j]==1)
    23                     sub++;
    24                 else
    25                     add++;
    26         }
    27         if(add==sub)
    28             ans++;
    29         return ;
    30     }
    31     for(int i=0;i<=1;i++)
    32     {
    33         a[n][cnt]=i;
    34         DFS(cnt+1);
    35     }
    36 }
    37 int main()
    38 {
    39     while(scanf("%d",&n))
    40     {
    41         memset(a,-1,sizeof(a));
    42         ans=0;
    43         DFS(1);
    44         printf("%d
    ",ans);
    45     }
    46     return 0;
    47 }
    我的打表代码
     1 #include<cstdio>
     2 int a[25]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,
     3             0,0,431095,822229};
     4 int main()
     5 {
     6     int n;
     7     while(scanf("%d",&n))
     8     {
     9         if(n==0)
    10             break;
    11         printf("%d %d
    ",n,a[n]);
    12     }
    13     return 0;
    14 }
    我的提交代码
  • 相关阅读:
    创建类型5-3:单例模式(Singleton Pattern)
    创建类型5-2:抽象工厂模式(Abstract Factory Pattern)
    创建类型5-1:工厂模式(Factory Pattern)
    第一章:Netty介绍
    第二章:第一个Netty程序
    第四章:Transports(传输)
    第十六章:从EventLoop取消注册和重新注册
    第十五章:选择正确的线程模型
    第十四章:实现自定义的编码解码器
    第十三章:通过UDP广播事件
  • 原文地址:https://www.cnblogs.com/-maybe/p/4391936.html
Copyright © 2020-2023  润新知