• code vs 3376 符号三角形


     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

    如下图是由14个“+”和14个“-”组成的符号三角形, 2个同号下面都是“+”,2个异号下面都是“-”
    - + + - + + +  
     - + - - + +  
      - - + - +  
       + - - -  
        - + +  
         - +  
          - 


    输入描述 Input Description

    一个数n,表示符号三角形的第一行有n个符号

    输出描述 Output Description

    对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同(严禁打表!!!!!)

    若不存在方案,输出-1

    样例输入 Sample Input

    4

    样例输出 Sample Output

    6

    数据范围及提示 Data Size & Hint

    对于90%的数据,n<=24;
    对于另外10%的数据,请注意特殊情况。

    分类标签 Tags 

    思路:写了个搜索,发现只能卡到70分,然后就用这个暴力打了个表,然后就过了。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 2500
    using namespace std;
    int n,sum,ans;
    int map[MAXN][MAXN];
    int judgenum(){
        int bns=0,k;
        for(int i=2;i<=n;i++){
            for(int j=1;j<=n-i+1;j++){
                if(map[i-1][j]!=map[i-1][j+1])    map[i][j]=0,bns++;
                else if(map[i-1][j]==map[i-1][j+1])    map[i][j]=1;
            }
        }
        for(int i=1;i<=n;i++)    if(map[1][i]==0)    bns++;
        if(bns==sum-bns)    return 1;
        else return 0;    
    }
    void dfs(int now,int num1,int num2){
        if(now==n+1){
            if(judgenum())    ans++;
            return ;
        }
        map[1][now]=1;dfs(now+1,num1+1,num2);map[1][now]=-1;
        map[1][now]=0;dfs(now+1,num1,num2+1);map[1][now]=-1;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)    sum+=i;
        if(sum%2!=0){ cout<<"-1";return 0; }
        memset(map,-1,sizeof(map));
        dfs(1,0,0);    
        cout<<ans;
    }
    /*
    - + + - + + +  
    - + - - + +  
    - - + - +
    + - - -  
    - + +  
    - +  
    - 
    */
    70分暴力
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 2500
    using namespace std;
    int n,sum,ans;
    int map[MAXN][MAXN];
    int anss[25]={0,-1,-1,4,6,-1,-1,12,40,-1,-1,171,410,-1,-1,1896,5160,-1,-1,32757,59984,-1,-1,431095,822229};
    int judgenum(){
        int bns=0,k;
        for(int i=2;i<=n;i++){
            for(int j=1;j<=n-i+1;j++){
                if(map[i-1][j]!=map[i-1][j+1])    map[i][j]=0,bns++;
                else if(map[i-1][j]==map[i-1][j+1])    map[i][j]=1;
            }
        }
        for(int i=1;i<=n;i++)    if(map[1][i]==0)    bns++;
        if(bns==sum-bns)    return 1;
        else return 0;    
    }
    void dfs(int now){
        if(now==n+1){
            if(judgenum())    ans++;
            return ;
        }
        map[1][now]=1;dfs(now+1);map[1][now]=-1;
        map[1][now]=0;dfs(now+1);map[1][now]=-1;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)    sum+=i;
        if(sum%2!=0){ cout<<"-1";return 0; }
        cout<<anss[n];
        /*for(n=1;n<=24;n++){
            memset(map,-1,sizeof(map));
            dfs(1);if(ans==0){ cout<<"-1,";sum=0;continue; }
            cout<<ans<<",";
            ans=0;sum=0;
        }*/
    }
    /*
    - + + - + + +  
    - + - - + +  
    - - + - +
    + - - -  
    - + +  
    - +  
    - 
    */
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    sql 读取txt 文件内容,并写入sql的方法
    Thread.Mutex 互斥体
    SQL语句创建登录名,数据库用户,数据库角色及分配权限:
    倾国倾城 歌词
    LINUX下c/c++的学习(4)linux file and direction(stat fstat lstat access umask chmod ...)
    飞蛾扑火
    生成验证码点击可刷新
    C#项目调用非托管代码函数的方法
    【学习】数据库事务
    如何判断数据库是否存在
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8835987.html
Copyright © 2020-2023  润新知