有个小问题求助
查看原帖
有个小问题求助
1133645
mazhemg123楼主2024/8/3 21:20

//为什么我把N设为9||10||11就会wa,它的范围不是小于等于9的吗哭

#include<iostream>
#include<cstring>
using namespace std;
#define int long long
const int N=12;
int F[N][1<<N][N*N];
int n,m;
int get_count(int x){
    return __builtin_popcount(x);
}

bool check1(int x){
    for(int i=0;i+1<n;i++){
        if(x&1<<i&&x&1<<(i+1))return false;
    }
    return true;
}
bool check2(int y,int x){
      for(int i=0;i<n;i++){
           if(y&1<<i){
              if(x&1<<i)return false;
              else if(i+1<n&&x&1<<(i+1))return false;
              else if(i-1>=0&&x&1<<(i-1))return false;
           }
      }
      return true;
}
signed main()
{
     cin>>n>>m;
     for(int a=0;a<(1<<n);a++)F[0][a][get_count(a)]=1;
     for(int i=1;i<n;i++){
         for(int a=0;a<(1<<n);a++){
             if(!check1(a))continue;
             for(int j=get_count(a);j<=m*m;j++){
                  for(int b=0;b<(1<<n);b++){
                      if(!check1(b)||!check2(a,b))continue;
                      F[i][a][j]+=F[i-1][b][j-get_count(a)];
                  }
             }
         }
     }
     int ans=0;
     for(int a=0;a<(1<<n);a++){
        ans+=F[n-1][a][m];
     }
     cout<<ans;
}
2024/8/3 21:20
加载中...