可达鸭超人放置跳棋

· · 个人记录

#include<iostream>
using namespace std;
const int N=1010;
int n;
long long ans;
void dfs(int x,int col,int ys,int zs){
    if(x==n+1){
        ans++;
        return;
    }
    int s=((1<<n)-1)&(~(col|ys|zs));
    int t;
    while(s){
        t=s&(-s);
        dfs(x+1,col+t,(ys+t)<<1,(zs+t)>>1);
        s-=t;
    }
}
int main(){
    while(cin>>n){
        ans=0;
        dfs(1,0,0,0);
        cout<<ans<<endl;
    }
    return 0;
}