zoukankan      html  css  js  c++  java
  • 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;
        }*/
    }
    /*
    - + + - + + +  
    - + - - + +  
    - - + - +
    + - - -  
    - + +  
    - +  
    - 
    */
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    博客园添加鼠标动态事件
    天津市蓟州区上仓中学恩师名单
    机器学习——支持向量机(Support Vector Machines)
    机器学习——贝叶斯和朴素贝叶斯
    使用jieba和gensim进行短文本分类(一):构建词向量
    Nginx(语法):05---Nginx配置文件语法
    docker单机部署 mysql8.0.20
    docker swarm 部署minio集群
    centos7 部署k8s集群
    docker compose 安装
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8835987.html
Copyright © 2011-2022 走看看