code vs 3376 符号三角形

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;
    forint i=2;i<=n;i++){
        forint j=1;j<=n-i+1;j++){
            ifmap[i-1][j]!=map[i-1][j+1])    map[i][j]=0,bns++;
            else ifmap[i-1][j]==map[i-1][j+1])    map[i][j]=1;
        }
    }
    forint i=1;i<=n;i++)    ifmap[1][i]==0)    bns++;
    ifbns==sum-bns)    return 1;
    else return 0;    
}
void dfsint now,int num1,int num2){
    ifnow==n+1){
        ifjudgenum))    ans++;
        return ;
    }
    map[1][now]=1;dfsnow+1,num1+1,num2);map[1][now]=-1;
    map[1][now]=0;dfsnow+1,num1,num2+1);map[1][now]=-1;
}
int main){
    scanf"%d",&n);
    forint i=1;i<=n;i++)    sum+=i;
    ifsum%2!=0){ cout<<"-1";return 0; }
    memsetmap,-1,sizeofmap));
    dfs1,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;
    forint i=2;i<=n;i++){
        forint j=1;j<=n-i+1;j++){
            ifmap[i-1][j]!=map[i-1][j+1])    map[i][j]=0,bns++;
            else ifmap[i-1][j]==map[i-1][j+1])    map[i][j]=1;
        }
    }
    forint i=1;i<=n;i++)    ifmap[1][i]==0)    bns++;
    ifbns==sum-bns)    return 1;
    else return 0;    
}
void dfsint now){
    ifnow==n+1){
        ifjudgenum))    ans++;
        return ;
    }
    map[1][now]=1;dfsnow+1);map[1][now]=-1;
    map[1][now]=0;dfsnow+1);map[1][now]=-1;
}
int main){
    scanf"%d",&n);
    forint i=1;i<=n;i++)    sum+=i;
    ifsum%2!=0){ cout<<"-1";return 0; }
    cout<<anss[n];
    /*forn=1;n<=24;n++){
        memsetmap,-1,sizeofmap));
        dfs1);ifans==0){ cout<<"-1,";sum=0;continue; }
        cout<<ans<<",";
        ans=0;sum=0;
    }*/
}
/*
- + + - + + +  
- + - - + +  
- - + - +
+ - - -  
- + +  
- +  
- 
*/

细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注