#include 赞 踩 把原始难题归约(简化)为下列3个子难题: 把原始难题归约(简化)为下列子难题: (1)移动圆盘A、B、和C 至柱子 (2)移动圆盘 D 至柱子 (3)移动圆盘A、B和C 至柱子 Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。
基于汉诺塔的问题归约图实现
一、求解汉诺塔(Hannoi)问题代码
#include "pch.h"
#include <fstream>
#include <iostream>
using namespace std;
int i = 0;
// 移动步骤
void Move(int n, char x, char y)
{
i++;
cout << "第" << i << "步:" << "圆盘" << n << " " << x << " —> " << y << endl;
}
// 递归求解
void Hannoi(int n, char a, char b, char c)
{
if (n == 1)
Move(1, a, c);
else
{
Hannoi(n - 1, a, c, b);
Move(n, a, c);
Hannoi(n - 1, b, a, c);
}
}
int main()
{
int n;
cout << "请输入要求解的汉诺塔的层数:";
cin >> n;
cout << n << "层汉诺塔圆盘移动步骤:" << endl;
Hannoi(n, 'a', 'b', 'c');
cout << "\n输出完毕!" << endl;
return 0;
}
二、汉诺塔问题归约图
1、圆盘的个数为 3
(1)移动圆盘 A 和 B 至柱子 2
的双圆盘难题
(2)移动圆盘 C 至柱子 3
的单圆盘难题
(3)移动圆盘 A 和 B 至柱子 3
的双圆盘难题
注意,归约图中的(x1,x2,x3)表示的是圆盘 A 在柱子 x3 上,圆盘 B 在 x2 上,圆盘 C 在 x1 上。
2、圆盘的个数为 4
2
的三圆盘难题① 移动圆盘 A 和 B 至柱子 3 的双圆盘难题
② 移动圆盘 C 至柱子 2 的单圆盘难题
③ 移动圆盘 A 和 B 至柱子 2 的双圆盘难题
3
的单圆盘难题3
的三圆盘难题① 移动圆盘 A 和 B 至柱子 1 的双圆盘难题
② 移动圆盘 C 至柱子 3 的单圆盘难题
③ 移动圆盘 A 和 B 至柱子 3 的双圆盘难题
三、4 层汉诺塔问题归约(分)图