清晰的讲解:http://blog.csdn.net/xadillax/article/details/6512318 代码:
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);
}