第1题:
第2题:
六个盘子中各放有一块糖,每次从任选的两个盘子中各取一块放入另一个盘子中,这样至少要做多少次,才能把所有的糖都集中到一个盘子中?
A.3 B.4 C.5 D.6
开始时是1,1,1,1,1,1,第一次变为0,0,3,1,1,1,第二次变为2,0,2,0,1,1,第三次变为4,0,1,0,0,1,第四次变为6,0,0,0,0,0。
第3题:
答案:结合二叉树的中序遍历,我们很容易就画出3阶汉诺塔的空间递归树:
中序遍历这个二叉树,遍历某个节点时,输出from和to,with无须输出,就可以得到3阶汉诺塔的移动顺序:
盘子:1A>>>>C
盘子:2A>>>>B
盘子:1C>>>>B
盘子:3A>>>>C
盘子:1B>>>>A
盘子:2B>>>>C
盘子:1A>>>>C
可以看到,汉诺塔算法所生成的二叉树是一个相当完美的“完全二叉树”,所以它的总节点数是2^3-1=7个。
二、先简化一下算法;通过层序遍历,构建双链表;顺序遍历双链表,输出!
1、再仔细观察一下递归树,例如第一层的节点:A--null--C,“分裂成”了第二层的两个节点:A--C--B和B--A--C,而第二层的第一个节点A--C--B,又“分裂成”了:A--null--C和C--null--B。简化一下:如果不考虑with柱,只考虑from和to柱,AC可以分裂成AB和BC,AB可以分裂成AC和CB......相信你已经看出规律了,所以可以进一步简化为下面的递归树:
2、通过队列来构造双链表:
为了实现算法,你需要写这样一个小函数:
private static final String str="ABC";
public String getWith(String from,String to){
String with;
//找出ABC中的某个和from、to都不相等的字符串,赋值给with
return with;
}
你还需要有一个节点类:
/**
* 汉诺塔节点
*
*/
public class HanNode {
/**
* 盘子的编号
*/
private int num;
/**
* from柱
*/
private String from;
/**to柱
*
*/
private String to;
/**
* 双链表中的前驱结点
*/
private HanNode pre;
/**
* 双链表中的后继结点
*/
private HanNode next;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public HanNode getPre() {
return pre;
}
public void setPre(HanNode pre) {
this.pre = pre;
}
public HanNode getNext() {
return next;
}
public void setNext(HanNode next) {
this.next = next;
}
public HanNode(int num, String from, String to) {
super();
this.num = num;
this.from = from;
this.to = to;
}
public HanNode() {
super();
}
@Override
public String toString() {
return " [盘子:" + num + ", 从:" + from + "到:" + to + "]";
}
}
还需要设置两个全局变量top和last作为双链表的头和尾,为了和其他的节点区分开来,设置它们的num为0;
下面的任务就是通过队列来构造双链表,对于某一趟运算:
①取出一个节点currentNode出队列,把这个currentNode的from和to传入getWith()函数,然后生成两个新的节点leftNode{num=currentNode.getNum()-1,from=from,to=with}和rightNode{num=currentNode.getNum()-1,from=with,to=to},压入队列。
②把生成的leftNode和rightNode插入到双链表中的currentNode的两端(需要断裂原来的链并生成新的链)
第4题:
第5题:
六个盘子中各放有一块糖,每次从任选的两个盘子中各取一块放入另一个盘子中,这样至少要做多少次,才能把所有的糖都集中到一个盘子中?
A.3
B.4
C.5
D.6
第6题:
用西餐时若需要暂时离开,应将餐巾折好( )。
A、放在椅子上
B、放在桌子上
C、放在盘子里
D、随手带走
第7题:
六个盘子中各放有一块糖,每次从任选的两个盘子中各取一块放入另一个盘子中,这样至少要做多少次,才能把所有的糖都集中到一个盘子中?( )
A.3次
B.4次
C.5次
D.6次
第8题:
甜点装盘时,下列说法正确的是( )。
A.盘子应干净卫生、无破损
B.除饰品外,所有主料、配料都不得露在盘子的外沿
C.装盘后盘子四周允许有少量的汤汁
D.盘子应是有相同风格的
第9题:
第10题:
甜点装盘时,所有的主料、配料及饰品不得露在()。