用c++写一个汉诺塔可视化的程序
时间: 2023-06-18 19:06:26 浏览: 191
好的,以下是一个用 C++ 编写的汉诺塔可视化程序:
```cpp
#include <iostream>
#include <graphics.h>
#include <conio.h>
using namespace std;
void drawPillar(int x, int y, int height, int width) {
setfillcolor(BROWN);
solidrectangle(x - width / 2, y, x + width / 2, y + height);
}
void drawDisk(int x, int y, int width, int height) {
setfillcolor(YELLOW);
solidrectangle(x - width / 2, y, x + width / 2, y + height);
}
void moveDisk(int from, int to, int n, int height, int width) {
int x1 = 100 + from * 200, x2 = 100 + to * 200;
int y = 400 - height * n;
for (int i = y; i >= 100; i -= 10) {
clearrectangle(x1 - width / 2, i, x1 + width / 2, i + height);
drawPillar(x1, 400, height, width);
if (from < to) {
drawPillar(x2, 400, height, width);
drawDisk(x2, i, 50 + n * 10, height);
}
drawDisk(x1, i, 50 + n * 10, height);
Sleep(100);
}
for (int i = x1; i != x2; i += (x2 - x1) / abs(x2 - x1)) {
clearrectangle(i - width / 2, 100, i + width / 2, y + height);
drawPillar(x1, 400, height, width);
if (from < to) {
drawPillar(x2, 400, height, width);
drawDisk(x2, y, 50 + n * 10, height);
}
drawDisk(i, y, 50 + n * 10, height);
Sleep(100);
}
for (int i = y + 10; i <= 400 - height * (n - 1); i += 10) {
clearrectangle(x2 - width / 2, i - 10, x2 + width / 2, i + height);
drawPillar(x1, 400, height, width);
if (from < to) {
drawPillar(x2, 400, height, width);
drawDisk(x2, i, 50 + n * 10, height);
}
drawDisk(x2, i, 50 + n * 10, height);
Sleep(100);
}
}
void hanoi(int from, int to, int via, int n, int height, int width) {
if (n == 0) return;
hanoi(from, via, to, n - 1, height, width);
moveDisk(from, to, n, height, width);
hanoi(via, to, from, n - 1, height, width);
}
int main() {
initgraph(800, 600);
drawPillar(100, 400, 200, 20);
drawPillar(300, 400, 200, 20);
drawPillar(500, 400, 200, 20);
hanoi(0, 2, 1, 5, 20, 150);
getch();
closegraph();
return 0;
}
```
该程序使用了 EasyX 图形库,可以在 Windows 系统下运行。在程序中,我们使用了 `drawPillar()` 函数来绘制柱子,使用 `drawDisk()` 函数来绘制盘子,使用 `moveDisk()` 函数来移动盘子。其中,`moveDisk()` 函数使用了 `Sleep()` 函数来控制动画播放速度。
在程序的 `main()` 函数中,我们首先初始化图形库,并绘制出三个柱子。然后,我们调用 `hanoi()` 函数来执行汉诺塔的移动操作。在 `hanoi()` 函数中,我们首先将前 `n-1` 个盘子从起始柱移动到中间柱,然后将最后一个盘子从起始柱移动到目标柱,最后将前 `n-1` 个盘子从中间柱移动到目标柱。在每次移动操作中,我们调用 `moveDisk()` 函数来实现盘子的平滑移动效果。
运行程序后,可以看到汉诺塔的移动动画。
阅读全文