#include<iostream>
#include <iomanip>
#include <math.h>
#include"Windows.h"
#include"cmd_console_tools.h"
#include"hanoi.h"
#define CURSOR_INVISIBLE 3 //光标不显示
using namespace std;
extern int step;//记录步数
extern int a[11], b[11], c[11];//记录柱子上的圆盘编号
extern int cnta, cntb, cntc;//记录此时这个柱子上的圆盘数量
//基本解
void solution1(int n, char src, char tmp, char dst)
{
step++;
int move = 0;//此时移动的圆盘编号
if (n == 1)
{
step++;
if (src == 'A')
{
move = a[cnta];
if (dst == 'B')
{
cntb++;
b[cntb] = a[cnta];
cnta--;
}
else
{
cntc++;
c[cntc] = a[cnta];
cnta--;
}
}
if (src == 'B')
{
move = b[cntb];
if (dst == 'A')
{
cnta++;
a[cnta] = b[cntb];
cntb--;
}
else
{
cntc++;
c[cntc] = b[cntb];
cntb--;
}
}
if (src == 'C')
{
move = c[cntc];
if (dst == 'B')
{
cntb++;
b[cntb] = c[cntc];
cntc--;
}
else
{
cnta++;
a[cnta] = c[cntc];
cntc--;
}
}//判断此时的src和dst是哪个柱子
cout << move << "# " << src << "---->" << dst << endl;
}
else
{
solution1(n - 1, src, dst, tmp);
solution1(1, src, tmp, dst);
solution1(n - 1, tmp, src, dst);
}
}
//基本解(步数记录)
void solution2(int n, char src, char tmp, char dst)
{
int move = 0;//此时移动的圆盘编号
if (n == 1)
{
step++;
if (src == 'A')
{
move = a[cnta];
if (dst == 'B')
{
cntb++;
b[cntb] = a[cnta];
cnta--;
}
else
{
cntc++;
c[cntc] = a[cnta];
cnta--;
}
}
if (src == 'B')
{
move = b[cntb];
if (dst == 'A')
{
cnta++;
a[cnta] = b[cntb];
cntb--;
}
else
{
cntc++;
c[cntc] = b[cntb];
cntb--;
}
}
if (src == 'C')
{
move = c[cntc];
if (dst == 'B')
{
cntb++;
b[cntb] = c[cntc];
cntc--;
}
else
{
cnta++;
a[cnta] = c[cntc];
cntc--;
}
}//判断此时的src和dst是哪个柱子
cout << "第"<<setw(4)<<step<<" 步("<<setw(2)<<move << "#: " << src << "--->" << dst <<")" << endl;
}
else
{
solution2(n - 1, src, dst, tmp);
solution2(1, src, tmp, dst);
solution2(n - 1, tmp, src, dst);
}
}
//内部数组显示(横向)
void solution3(int n, char src, char tmp, char dst)
{
int move = 0;
if (n == 1)
{
step++;
if (src == 'A')
{
move = a[cnta];
if (dst == 'B')
{
cntb++;
b[cntb] = a[cnta];
cnta--;
}
else
{
cntc++;
c[cntc] = a[cnta];
cnta--;
}
}
if (src == 'B')
{
move = b[cntb];
if (dst == 'A')
{
cnta++;
a[cnta] = b[cntb];
cntb--;
}
else
{
cntc++;
c[cntc] = b[cntb];
cntb--;
}
}
if (src == 'C')
{
move = c[cntc];
if (dst == 'B')
{
cntb++;
b[cntb] = c[cntc];
cntc--;
}
else
{
cnta++;
a[cnta] = c[cntc];
cntc--;
}
}
cout << "第" << setw(4) << step << " 步(" << setw(2) << move << "): " << src << "-->" << dst << " ";
cout << "A:";
for (int i = 1; i <= cnta; i++)
{
cout << setw(2) << a[i];
}
for (int i = 1; i <= 21 - 2 * cnta; i++)
{
cout << " ";
}
cout<<"B:";
for (int i = 1; i <= cntb; i++)
{
cout << setw(2) << b[i];
}
for (int i = 1; i <= 21 - 2 * cntb; i++)
{
cout << " ";
}
cout << "C:";
for (int i = 1; i <= cntc; i++)
{
cout<<setw(2)<<c[i];
}
for (int i = 1; i <= 21 - 2 * cntc; i++)
{
cout<<" ";
}
cout << endl;
}
else
{
solution3(n - 1, src, dst, tmp);
solution3(1, src, tmp, dst);
solution3(n - 1, tmp, src, dst);
}
}
//内部数组显示(纵向+横向)
void picture(int x, int y, char dst)
{
cct_gotoxy(x, y);//初始(13,27)
cout << "=========================" << endl;
cct_gotoxy(x + 2, y + 1);
cout << "A";
cct_gotoxy(x + 12, y + 1);
cout << "B";
cct_gotoxy(x + 22, y + 1);
cout << "C";
for (int i = 1; i <= cnta; i++)
{
cct_gotoxy(x + 2, y - i);
cout << a[i];
}//输出A现有的圆盘编号
for (int i = cnta + 1; i <= 10; i++)
{
cct_gotoxy(x + 2, y - i);
cout << " ";
}//将多余的位置覆盖
for (int i = 1; i <= cntb; i++)
{
cct_gotoxy(x + 12, y - i);
cout << b[i];
}//输出B现有的圆盘编号
for (int i = cntb + 1; i <= 10; i++)
{
cct_gotoxy(x + 12, y - i);
cout << " ";
}//将多余的位置覆盖
for (int i = 1; i <= cntc; i++)
{
cct_gotoxy(x + 22, y - i);
cout << c[i];
}//输出C现有的圆盘编号
for (int i = cntc + 1; i <= 10; i++)
{
cct_gotoxy(x + 22, y - i);
cout << " ";
}//将多余的位置覆盖
if (dst == 'A')
{
cct_gotoxy(x + 3, y - cnta);
}
else if (dst == 'B')
{
cct_gotoxy(x + 13, y - cntb);
}
else
{
cct_gotoxy(x + 23, y - cntc);
}//将光标移动到这一步的末尾
}
void velocity0(int n, char src, char tmp, char dst, int display)
{
int move;
if (n == 1)
{
step++;
if (src == 'A')
{
move = a[cnta];
if (dst == 'B')
{
cntb++;
b[cntb] = a[cnta];
cnta--;
}
else
{
cntc++;
c[cntc] = a[cnta];
cnta--;
}
}
if (src == 'B')
{
move = b[cntb];
if (dst == 'A')
{
cnta++;
a[cnta] = b[cntb];
cntb--;
}
else
{
cntc++;
c[cntc] = b[cntb];
cntb--;
}
}
if (src == 'C')
{
move = c[cntc];
if (dst == 'B')
{
cntb++;
b[cntb] = c[cntc];
cntc--;
}
else
{
cnta++;
a[cnta] = c[cntc];
cntc--;
}
C++实现的汉诺塔小游戏
需积分: 5 193 浏览量
2024-05-21
16:00:42
上传
评论
收藏 776KB RAR 举报
ypeijasd
- 粉丝: 192
- 资源: 25
最新资源
- Servlet和JDBC实现三层架构
- Appium-Inspector-2024.6.1-win
- Screenshot_2024-06-14-21-22-39-202_net.csdn.csdnplus.jpg
- Appium-Server-GUI-windows-1.22.3-4
- 基于C语言+python实现的永磁同步电机矢量控制算法仿真+源码(毕业设计&课程设计&项目开发)
- APKPure_v3.20.05_apkpure.com.apk
- HKJC_AOSBS_PROD_L2.7R2Q_Build8172.apk
- jetson官网下载的官方资料
- 小游戏的java程序开发
- matlab GUI仿真资源.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈