清晰的讲解:http://blog.csdn.net/xadillax/article/details/6512318
代码:
#include<stdio.h>
int n,ans,lim;
inline const int read(){
register int f=1,x=0;
register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return f*x;
}
void dfs(int r,int ld,int rd){
if(r!=lim){
int pos=lim&~(r|ld|rd);
while(pos){
int p=pos&-pos;
pos-=p;
dfs(r+p,(ld+p)<<1,(rd+p)>>1);
}
}
else ans++;
}
int main(){
n=read();
lim=(1<<n)-1;
dfs(0,0,0);
printf("%d",ans);
}