【题解】CodeVS 1295 N皇后问题,1958 刺激,3113 二叉树计数2

1295 N皇后问题

 

#include<cstdio>
int g[20],n,cnt,vis[20];
int is_ok(int k){
    for(int i=0;i<k;i++)
        if(i-g[i]==k-g[k]||i+g[i]==k+g[k])return 0;
    return 1;
}
void dfs(int k){
    if(k==n){
        cnt++;
        return ;
    }
    for(int i=0;i<n;i++)if(!vis[i]){
        vis[i]=1;
        g[k]=i;
        if(is_ok(k))dfs(k+1);
        vis[i]=0;
    }
}
int main()
{
    scanf("%d",&n);
    dfs(0);
    printf("%d\n",cnt);
	return 0;
}

 

 

 

 

 

 

1958 刺激

 

#include<cstdio>
#include<cmath>
int m,n,ans;
double a[101][101],all;
void dfs(int i,int j,int s,int x){
    ans=(ans>x?ans:x);
    if(s){
        if(i+1<m&&a[i+1][j]>a[i][j]&&a[i+1][j]<=all)dfs(i+1,j,!s,x+1);
        if(j+1<n&&a[i][j+1]>a[i][j]&&a[i][j+1]<=all)dfs(i,j+1,!s,x+1);
    }else{
        if(i+1<m&&a[i+1][j]<a[i][j]&&a[i+1][j]<=all)dfs(i+1,j,!s,x+1);
        if(j+1<n&&a[i][j+1]<a[i][j]&&a[i][j+1]<=all)dfs(i,j+1,!s,x+1);
    }
}
int main()
{
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            scanf("%lf",&a[i][j]);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++){
            all=a[i][j];
            dfs(i,j,0,1);
        }
    printf("%d\n",ans);
	return 0;
}

 

 

 

3113 二叉树计数2

 

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct BigInteger{//可恶的高精度
    int A[25];
    enum{MOD = 10000};
    BigInteger(){memset(A, 0, sizeof(A)); A[0]=1;}
    void set(int x){memset(A, 0, sizeof(A)); A[0]=1; A[1]=x;}
    void print(){
        printf("%d", A[A[0]]);
        for (int i=A[0]-1; i>0; i--){
            if (A[i]==0){printf("0000"); continue;}
            for (int k=10; k*A[i]<MOD; k*=10) printf("0");
            printf("%d", A[i]);
        }
        printf("\n");
    }
    int& operator [] (int p) {return A[p];}
    const int& operator [] (int p) const {return A[p];}
    BigInteger operator + (const BigInteger& B){
        BigInteger C;
        C[0]=max(A[0], B[0]);
        for (int i=1; i<=C[0]; i++)
            C[i]+=A[i]+B[i], C[i+1]+=C[i]/MOD, C[i]%=MOD;
        if (C[C[0]+1] > 0) C[0]++;
        return C;
    }
    BigInteger operator * (const BigInteger& B){
        BigInteger C;
        C[0]=A[0]+B[0];
        for (int i=1; i<=A[0]; i++)
            for (int j=1; j<=B[0]; j++){
                C[i+j-1]+=A[i]*B[j], C[i+j]+=C[i+j-1]/MOD, C[i+j-1]%=MOD;
            }
        if (C[C[0]] == 0) C[0]--;
        return C;
    }
}a[101];
int main()
{
    int n;
    a[0].set(1);a[1].set(1);a[2].set(2);
    scanf("%d",&n);
    for(int i=3;i<=n;i++)
        for(int k=0;k<i;k++)
            a[i]=a[i]+a[k]*a[i-k-1];
    a[n].print();
	return 0;
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值