​B - Bits​

这是一个很经典的汉诺塔问题,该题主要难点在于输出和递归思想。

主要的递归代码:

​hanoi(x,a,b,c)​​表示完成第 x 个圆盘的移动,是从支柱 a 借助支柱 b 的力量移向支柱 c 的

void hanoi(int x, int a, int b, int c) { if(x==1) { v[c].push_back(v[a].back()); v[a].pop_back(); print(1); } else{ hanoi(x-1,a,c,b); v[c].push_back(v[a].back()); v[a].pop_back(); print(1); hanoi(x-1,b,a,c); } }

代码:

// Created by CAD on 2020/1/19.
#include <bits/stdc++.h>
using namespace std;

int n,m;
vector<int> v[4];
void print(bool flag)
{
if(flag)
{
for(int i=1;i<=m;++i)
cout<<'-';cout<<endl;
}
for(int i=1;i<=m;++i) cout<<'.';cout<<endl;
for(int i=1;i<=n+1;++i)
{
cout<<'.';
for(int j=1;j<=3;++j)
{
if(v[j].size()+i<=n+1)
{
for(int k=1;k<=n;++k) cout<<'.';
cout<<'|';
for(int k=1;k<=n;++k) cout<<'.';
}
else{
int t=v[j][n+1-i];
for(int k=1;k<=n-t;++k) cout<<'.';
for(int k=1;k<=t;++k) cout<<'*';
cout<<'*';
for(int k=1;k<=t;++k) cout<<'*';
for(int k=1;k<=n-t;++k) cout<<'.';
}
cout<<'.';
}
cout<<'\n';
}
}
void hanoi(int x, int a, int b, int c)
{
if(x==1) {
v[c].push_back(v[a].back());
v[a].pop_back();
print(1);
}
else{
hanoi(x-1,a,c,b);
v[c].push_back(v[a].back());
v[a].pop_back();
print(1);
hanoi(x-1,b,a,c);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n; m=3*(2*n+1)+4;
for(int i=n;i>=1;--i) v[1].push_back(i);
print(0);
if(n&1) hanoi(n,1,3,2);
else hanoi(n,1,2,3);
return 0;
}

CAD加油!欢迎跟我一起讨论学习算法