90pt,4RE,求调()
查看原帖
90pt,4RE,求调()
1439503
WarEpic楼主2024/12/4 14:44
#include <stdio.h>
#include <stdlib.h>

int n, m, inx=0;
long long int ***dp, *situation, *count;//situation[i]表示第i行状态,count[i]表示第i行状态下的国王数量

void init(){
    scanf("%d %d", &n, &m);
    dp=(long long int***)malloc(sizeof(long long int**)*(n+1));//dp[i][j][k]前i行已放置j个国王,第i行状态为第k种状态
    for(int i=0;i<=n;i++){
        dp[i]=(long long int**)malloc(sizeof(long long int*)*(1+(1<<n)));
        for(int j=0;j<=(1<<n);j++){
            dp[i][j]=(long long int*)malloc(sizeof(long long int)*(m+1));
            for(int k=0;k<=m;k++) dp[i][j][k]=0;
        }
    }
    situation=(long long int*)malloc(sizeof(long long int)*(1+(1<<n)));
    for(long long int i=0;i<=(1<<n);i++) situation[i]=0;
    count=(long long int*)malloc(sizeof(long long int)*(1+(1<<n)));
    for(long long int i=0;i<=(1<<n);i++) count[i]=0;
}

void dfs(int x, int num, int node){//搜索一行所有的状态和对应的位于该行国王的数量
    if(node>=n){
        situation[++inx]=x;//inx对于一行的不同状态数量
        count[inx]=num;
        return;
    }
    dfs(x, num, node+1);//不在node放置国王
    dfs(x+(1<<node), num+1, node+2);//在node放置国王
}

int judge(int index1, int index2){//判断两种状态相邻时是否冲突
    if(situation[index1] & situation[index2]) return 0;
    if(situation[index1] & (situation[index2]<<1)) return 0;
    if((situation[index1]<<1) & situation[index2]) return 0;//只能用左移
    return 1;
}

void dp_search(){
    for(int j=1;j<=inx;j++) dp[1][j][count[j]]=1;//第一行放置国王
    for(int i=2;i<=n;i++){//从第二行开始
        for(int j=1;j<=inx;j++){
            for(int x=1;x<=inx;x++){
                if(!judge(j, x)) continue;
                for(int k=count[j];k<=m;k++) dp[i][j][k]+=dp[i-1][x][k-count[j]];
            }
        }
    }
}

void output(){
    long long int ans=0;
    for(int i=1;i<=inx;i++) ans+=dp[n][i][m];
    printf("%lld\n", ans);
}

void free_arr(){
    for(int i=0;i<=n;i++) for(int j=0;j<=(1<<n);j++) free(dp[i][j]);
    for(int i=0;i<=n;i++) free(dp[i]);
    free(dp), free(situation), free(count);
}

int main(){
    init();
    dfs(0, 0, 0);
    dp_search();
    output();
    free_arr();
    return 0;
}
2024/12/4 14:44
加载中...