nyoj491 幸运三角形 dfs

//打表题   这种时间明显不够,但样例有限的,可在线下先计算出所有结果,存入数组


/*
#include<stdio.h>  
int n,a[20]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757};  
int main()  
{  
    while(~scanf("%d",&n))  
    {  
        printf("%d\n",a[n]);  
    }  



*/
#include<stdio.h>  
#include<string.h>  
int n,cnt,vis[30],map[22][22];  
int a,b;


bool judge()  //根据最上层,推出下面几层的,并进行判断是否符合条件 
{  
    for(int i=0;i<n;i++)  
    {  
        for(int j=0;j<n-i-1;j++)   //理解这里j<n-i-1 什么意思 
        {  
            if(map[i][j]==map[i][j+1])  // 0 0 0 n为3时第一种情况 
            {       // 1 1
                map[i+1][j]=1;       // 1
                b++;  
            }  
            else  
            {  
                map[i+1][j]=0;  
                a++;  
            }  
        }  
    }  
    if(a==b) 
return true;  
    else 
return false;  
}  
  
void dfs(int cur)  
{  
    a=0,b=0;  
    if(cur>=n)//最上层长度达到 n 
    {  
        for(int i=0;i<n;i++)  
        {  
            map[0][i]=vis[i];  
            if(map[0][i]==0) 
a++;  
            else 
b++;  
        }  
        
        if(judge())  
cnt++;  
        return;  
    } 
    vis[cur]=0; //0,1两种情况都试一下 
    dfs(cur+1);  
    vis[cur]=1;  
    dfs(cur+1);  
}  
  
int main()  
{  
    while(~scanf("%d",&n))  
    {  
        cnt=0;  
        dfs(0);  
        printf("%d\n",cnt);  
    }  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值