java hanoi_JAVA:New towers of Hanoi
全部程序实现:
package ch2.divide;
public class NewHanoi {
public static int count = 0;
// /这个地方的用途就是找到A杆顶端要移动的盘子的编号i
// //将 这个盘子移动到C杆上,修改current[i]的值为C
// //累加移动盘子的次数然后输出A——>C的信息
// //找出当前需要移动的杆子(根据ABC符号进行识别)的顶部盘子的编号i
// //修改当前编号的盘子所在的杆子的符号
// ---这个函数的作用是寻找发现当前移动的盘子所在杆子的状态变化的一个记录修改-----//
private static int pickTopDisk(char[] current, char a) {
int i = 1;
while (current[i] != a) {
i++;
}
return i;
}
// 汉诺塔基本的搬运算法
public static void hanoi(char[] current, int n, char A, char B, char C) {
if (n == 1) {
int i;
i = 1;
i = pickTopDisk(current, A);
current[i] = C;
count++;
// /只有一块圆盘 , 直接移至c
System.out.println("move" + count + " disk " + i + ":" + A + "——>" + C);
return;
}
// /第一,把a上的n-1个盘通过c移动到b
hanoi(current, n - 1, A, C, B);
current[n] = C;
// 这里第n个盘子就是下标为n-1,一定要记在心里
count++;
System.out.println("move" + count + " disk " + n + ":" + A + "——>" + C);
hanoi(current, n - 1, B, A, C);
}
将小于目标盘的所有盘摞成一个塔的形状(小盘位于大盘之上)
public static void makeTower(char[] c, int n) {
char temp; //临时的字符声明
//------n=1和n=2特殊情况可以直接处理--------///
if (n == 1)
return;
///将1号盘子移动到2号盘子之上
if (n == 2) {
if (c[1] != c[2]) {
count++;
System.out.println("move" + count + " disk " + 1 + ":" + c[1] + "——>" + c[2]);
c[1] = c[2];
}
return;
}
//情况1------n=1和n=2特殊情况可以直接处理--------///
//情况2------n,n-1,n-2都不在同一个盘子上--------///
if (c[n] != c[n - 1] && c[n] != c[n - 2] && c[n - 1] != c[n - 2]) {
makeTower(c, n - 2);
// 将n-1移到n上
count++;
System.out.println("move" + count + " disk " + (n - 1) + ":" + c[n - 1] + "——>" + c[n]);
temp = c[n - 1];
c[n - 1] = c[n];
hanoi(c, n - 2, c[n - 2], temp, c[n-1]);
return;
}
//情况2------n,n-1,n-2都不在同一个盘子上--------///
makeTower(c, n - 1); //这个地方自由的递归实现不断的细化减少盘子的编号
///这个地方是一般情况下,我们会找到一个空余的位置利用hanoi的基本搬运算法把所有的n-1个盘子移动过去
if (c[n - 1] != c[n]) {
temp = (char) ('A' + 'B' + 'C' - c[n] - c[n - 1]);
hanoi(c, n - 1, c[n - 1], temp, c[n]);
}
}
public static void main(String[] args) {
///字符数组中的0用来占据位置作为数组中国0这个位置的站位字符 在实际的操作中不使用
char[] current = { 0, 'C', 'C', 'C', 'B', 'B' };
char[] target = { 0, 'C', 'A', 'C', 'B', 'C' };
int k = 5;
char temp;
//找到第一个最大的不符合要求的盘子
while (current[k] == target[k] && k > 0)
k--;
// 如果k>2,把1...k-1移到k-1上 形成一摞有序的k-1盘子
if (k > 2)
makeTower(current, k - 1);
while (k > 1) {
///腾出目标位置
if (current[k] != target[k]) {
if (current[k] == current[k - 1]) {
如果k-1个盘子在current[k]上面,将其移动到空闲的杆子上面
temp = (char) ('A' + 'B' + 'C' - current[k] - target[k]);
hanoi(current, k - 1, current[k - 1], target[k], temp);
} else if (current[k - 1] == target[k]) {
如果k-1个盘子在target[k]上面,将其移动到空闲的杆子上面
temp = (char) ('A' + 'B' + 'C' - current[k] - target[k]);
hanoi(current, k - 1, current[k - 1], current[k],temp);
}
count++;
///将第k个盘子移动到目标位置
System.out.println("move" + count + " disk " + k + ":" + current[k] + "——>" + target[k]);
current[k] = target[k];
}
k--;
}
if (current[1] != target[1]) {
count++;
System.out.println("move" + NewHanoi.count + " disk " + 1 + ":" + current[1] + "——>" + target[1]);
current[1] = target[1];
}
}
}
java hanoi_JAVA:New towers of Hanoi相关推荐
- UVA254 Towers of Hanoi【DFS】
In 1883, Edouard Lucas invented, or perhaps reinvented, one of the most popular puzzles of all times ...
- WeChall Towers of Hanoi (Java, Crac... 答案
还没开始学Java,先贴下别人的答案,省得以后找不到. Towers of Hanoi - 我怎么能不努力奋斗 - 博客园
- Strange Towers of Hanoi (POJ1958)
Strange Towers of Hanoi (POJ1958) n个盘子4座塔的Hanoi问题至少需要多少步?(1<=n<=12) 分析: n盘3塔: \(d[n] = 2*d[n-1 ...
- POJ1958 Strange Towers of Hanoi [递推]
题目传送门 Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3117 Ac ...
- Strange Towers of Hanoi 汉诺塔问题及其升级(递推)四个汉诺塔问题
今天学习递推的汉诺塔问题,非常的有趣 文章目录 1.汉诺塔问题来源 分析 2.Strange Towers of Hanoi[DP][递推] 题目大意: 思考 解题步骤: 1.汉诺塔问题来源 汉诺塔( ...
- java 终极超类,Java问答:终极父类(3),java问答
Java问答:终极父类(3),java问答Java问答:终极父类(上) Java问答:终极父类(下) Java问答:终极父类(2)-上篇 Java问答:终极父类(2)-下篇 在之前关于 Object ...
- public接口可以被任何一个类实现_一文带你深入Java核心技术:对象克隆+接口与回调,还有这种操作...
对象克隆 当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,如图6-1所示.这就是说,改变一个变量所引用的对象将会对另一个变量产生影响. Employee original = new Employ ...
- 清华学霸花了三年时间对java理解: Java分布式架构
什么是分布式架构 分布式系统(distributed system)是建立在网络之上的软件系统. 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统. 透明性是指每一个数据库分布节点对用户 ...
- Java线程:线程的调度-合并
Java线程:线程的调度-合并 线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法. join为非静态方法,定义 ...
最新文章
- 为了上班摸鱼,我用Python开发“BOSS来了”
- GeneGAN: Learning Object Transfiguration and Attribute Subspace from Unpaired Data
- Python运行异常 Original error was: DLL load failed:
- cadence 常见pcb电阻_经验分享|高频PCB设计中出现的干扰分析及对策
- 机器学习:随机森林算法及其实现
- 【机器学习】ICA 原理以及相关概率论,信息论知识简介
- Composer + thinkphp5.1安装与使用
- dell服务器开机自动进入bios设置,dell服务器进入bios设置独立显卡(戴尔bios显卡设置在哪)...
- Unity3D水下动物模型大集合
- 轮廓(查找和绘制轮廓、轮廓的表达与组织、轮廓的特性)
- Windows 10 无法访问共享的解决办法大全
- Python绘制一箭穿双心 动画代码
- matlab中floor函数,floor函数
- NYOJ小明的存钱计划
- Brain Predicted Age (一)
- 【不忘初心】经典珍藏 LTSB|1709|1809|LTSC 四版集合八合一[纯净精简版]2020.07.20
- 香港大学计算机视觉识别教授排名,北京师范大学香港浸会大学联合国际学院四位教师的课题喜获国家自然科学基金资助...
- 侍魂胧月传说服务器维护中,侍魂胧月传说手游3月2日停机维护更新公告
- 谷歌Chrome 操作系统
- 实现一个鼠标自动按键程序