```cpp
#include<cstdio>
#define fo(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int n,a[25],b[169],p,max,ans;
void dg(int x,int w,int s)
{
if(x>max)return;
b[x]=w;
if(x==max)
{
if (w!=n+1) return;
fo(i,1,x)
{
printf("%d ",b[i]);
if(i%20==0) printf("\n");
}
p=1;
return;
}
if(w>2&&a[w-2]==1)
{
int k=a[w];a[w]=a[w-2];a[w-2]=k;
dg(x+1,w-2,s-(1<<(w-3))+(1<<(w-1)));
if(p)return;
k=a[w];a[w]=a[w-2];a[w-2]=k;
}
if(w>1&&a[w-1]==1)
{
int k=a[w];a[w]=a[w-1];a[w-1]=k;
dg(x+1,w-1,s-(1<<(w-2))+(1<<(w-1)));
if(p)return;
k=a[w];a[w]=a[w-1];a[w-1]=k;
}
if(w<n+n+1&&a[w+1]==2)
{
int k=a[w];a[w]=a[w+1];a[w+1]=k;
dg(x+1,w+1,s);
if(p)return;
k=a[w];a[w]=a[w+1];a[w+1]=k;
}
if(w<n+n&&a[w+2]==2)
{
int k=a[w];a[w]=a[w+2];a[w+2]=k;
dg(x+1,w+2,s);
if(p)return;
k=a[w];a[w]=a[w+2];a[w+2]=k;
}
}
int main()
{
scanf("%d",&n);
fo(i,1,n) {a[i]=1; a[i+n+1]=2;}
a[n+1]=0;
max=(n+2)*n;
ans=(1<<(n+n+1))-(1<<(n+1));
dg(0,n+1,(1<<n)-1);
}应该是这样
```
by hejiaqi123 @ 2017-03-18 12:55:53