就是暴力,没有话说
用二维数组存盘子的位置嗯
#include<cstdio>
#include<algorithm>
using namespace std;
int a[13][13]; int num=0;
bool flag=true;
void initial(int n){
for(int i=1;i<=n;i++){
a[i][1]=n-i+1;
}
}
void pr(int n){
for(int i=0;i<3(2n+1)+4;i++)//第一行
printf(".");
printf("\n");
for(int i=n+1;i>=1;i--){//中间每一行
printf(".");
for(int j=1;j<=3;j++){
if(a[i][j]==0){
for(int w=0;w<n;w++)
printf(".");
printf("|");
for(int w=0;w<n;w++)
printf(".");
}
else{
for(int w=0;w<n-a[i][j];w++)
printf(".");
for(int w=0;w<a[i][j]
2+1;w++)
printf("
");
for(int w=0;w<n-a[i][j];w++)
printf(".");
}
printf(".");
}
printf("\n");
}
if(flag!=0){
for(int i=0;i<3(2n+1)+4;i++)//最后一行
printf("-");}
}
void f(int n,int u,int b,int c){
if(n==1){
printf("\n");
int s=1,p=num;
while(a[p][u]==0)p--;
while(a[s][b]>0)s++;if(s==num)flag=false;
swap(a[p][u],a[s][b]);
pr(num);
return;
}
f(n-1,u,c,b);//前n-1个盘子移到2号位
printf("\n");//第n个盘子移到3号位
int s=1,p=num;
while(a[p][u]==0)p--;
while(a[s][b]>0)s++;if(s==num)flag=false;
swap(a[p][u],a[s][b]);
pr(num);
f(n-1,c,b,u);//前n-1个盘子移到3号位
}</algorithm></cstdio>

int main(){

scanf("%d",&num);

initial(num);    pr(num);
if(num%2==0)
f(num,1,3,2);
else
f(num,1,2,3);
return 0;

}