Java语言怎么用队列的方式实现汉诺塔的移动求解?双向队列怎么解决汉诺塔的问题的呢?定义和实现,计算的做法
看下是这个意思不 :
代码如下 :
import java.util.LinkedList;
import java.util.Queue;
public class HanoiTower {
public static void hanoiTower(int n, char start, char auxiliary, char end) {
Queue<String> queue = new LinkedList<>();
// 将初始移动任务加入队列
String task = n + " " + start + " " + auxiliary + " " + end;
queue.offer(task);
while (!queue.isEmpty()) {
// 取出队列中的任务
String currentTask = queue.poll();
String[] parts = currentTask.split(" ");
int disk = Integer.parseInt(parts[0]);
char from = parts[1].charAt(0);
char to = parts[3].charAt(0);
if (disk == 1) {
// 只有一个盘子时直接移动
System.out.println("将第1个盘子从柱子" + from + "移动到柱子" + to);
} else {
// 将当前任务拆分为三个子任务,分别放入队列中
char other = getOther(from, to);
String task1 = (disk - 1) + " " + from + " " + to + " " + other;
String task2 = "1 " + from + " " + other + " " + to;
String task3 = (disk - 1) + " " + other + " " + from + " " + to;
queue.offer(task1);
queue.offer(task2);
queue.offer(task3);
}
}
}
private static char getOther(char from, char to) {
if ((from == 'A' && to == 'B') || (from == 'B' && to == 'A')) {
return 'C';
} else if ((from == 'A' && to == 'C') || (from == 'C' && to == 'A')) {
return 'B';
} else {
return 'A';
}
}
public static void main(String[] args) {
int n = 3;
hanoiTower(n, 'A', 'B', 'C');
}
}
思路 :
代码中定义了一个名为hanoiTower的静态方法,它使用队列来实现汉诺塔的移动求解,参数n表示盘子的数量,start表示初始柱子,auxiliary表示辅助柱子,end表示目标柱子。
demo中创建一个LinkedList作为队列来存储移动任务,将初始移动任务加入队列后,进入循环,不断从队列中取出任务并执行,如果当前任务只有一个盘子,则直接进行移动操作,否则将当前任务拆分为三个子任务,并将子任务加入队列中,拆分子任务时,需要根据当前柱子和目标柱子确定辅助柱子的位置。
demo中初始的盘子数量为3,初始柱子为A,辅助柱子为B,目标柱子为C。
双向队列,它可以从两端进行插入和删除操作。在汉诺塔问题中,我们只需要按照固定顺序执行操作,那么使用普通的队列已经足够啦,双向队列并不能提供额外的好处,所以普通队列就可以解决汉诺塔问题,帅!!!!!
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址,大小以及使用情况。通常,GC采用有向图的方式记录和管理堆中所有的对象,通过这种方式确定哪些对象时可达的,哪些对象时不可达的,当GC确定一些对象不可达时,GC就有责任回收这些内存空间。
程序员可以手动执行System.gc() ,通知GC运行,但java语言规范并不保证GC一定会执行