传送门
题目描述:
代码实现
#include<map>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<set>
#include<vector>
#include<numeric>
using namespace std;
int n, t[5], s[15][5];//盘子的数量
void show()
{
for (int i = 1; i <= 3 * (2 * n + 1) + 4; i++)
putchar('.');//第一行全部都是'.'
putchar('\n');
//从顶层开始打印
for (int i = n + 1; i >= 1; i--) {
for (int j = 1; j <= 3; j++) {
for (int k = 0; k <= n - s[i][j]; k++)
putchar('.');//第j根柱子的第i层盘子左边的'.',这里包括了中间相隔的‘.’
for (int k = 0; k < s[i][j]; k++)
putchar('*');//盘子左边
putchar(s[i][j] ? '*' : '|');
for (int k = 0; k < s[i][j]; k++)
putchar('*');//盘子右边
for (int k = 0; k < n - s[i][j]; k++)
putchar('.');//右边的'.'
}
putchar('.');//最后一根柱子盘子右边还有一个‘.’
putchar('\n');
}
}
void move(int sta, int en)
{
s[++t[en]][en] = s[t[sta]][sta];
s[t[sta]--][sta] = 0;
for (int i = 1; i <= 3 * (2 * n + 1) + 4; i++)
putchar('-');
putchar('\n');
show();
}
void hanoi(int sta, int tmp, int en, int k)
{
if (k == 1)
move(sta, en);
else
{
hanoi(sta, en, tmp, k - 1);
move(sta, en);
hanoi(tmp, sta, en, k - 1);
}
}
int main()
{
cin >> n;
//t[i]表示第i根柱子有几层盘子
for (int i = 1; i <= n; i++)
s[++t[1]][1] = n - i + 1;//s[x][y]表示第y个柱子的第x层的盘子半径
show();
if (n % 2 == 0)
hanoi(1, 2, 3, n);
else
hanoi(1, 3, 2, n);
return 0;
}