用C++写一个汉诺塔程序
时间: 2023-04-12 16:01:57 浏览: 153
好的,以下是用 C 语言写的汉诺塔程序:
```
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf("Move disk 1 from %c to %c\n", A, C);
return;
}
hanoi(n-1, A, C, B);
printf("Move disk %d from %c to %c\n", n, A, C);
hanoi(n-1, B, A, C);
}
int main() {
int n;
printf("Enter the number of disks: ");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
```
这个程序可以解决汉诺塔问题,其中 n 表示盘子的数量,A、B、C 分别表示三个柱子。程序会输出每一步的移动过程,让用户可以清晰地看到整个过程。
相关问题
用c++写一个汉诺塔可视化的程序
好的,以下是一个用 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()` 函数来实现盘子的平滑移动效果。
运行程序后,可以看到汉诺塔的移动动画。
用c++生成一个汉诺塔小游戏
以下是一个用C++生成汉诺塔小游戏的示例代码:
```c++
#include <iostream>
using namespace std;
void move(int n, char a, char b, char c) {
if (n == 1) {
cout << "Move disk 1 from " << a << " to " << c << endl;
return;
}
move(n - 1, a, c, b);
cout << "Move disk " << n << " from " << a << " to " << c << endl; move(n - 1, b, a, c);
}
int main() {
int n;
cout << "Enter the number of disks: ";
cin >> n;
move(n, 'A', 'B', 'C');
return 0;
}
```
运行程序后,用户需要输入盘子的数量,程序将输出每一步的移动过程,直到所有盘子都从A柱移动到C柱。
阅读全文