有3个柱子(1,2 和3)和3 个不同尺寸的圆盘(A,B 和C)。在每个圆盘的中心有个孔,所以圆盘可以堆叠在柱子上。最初,全部3 个圆盘都堆在柱子1 上:最大的圆盘C在底部,最小的圆盘A在顶部。要求把所有圆盘都移动到柱子3,每次只许移动一个,而且只能先搬动柱子顶部的圆盘,还不许把尺寸较大的圆盘放在尺寸较小的圆盘上。这个问题的初始状态和目标状态如下图所示。
为给出一种移动方法,下列程序使用了深度优先搜索策略,并使用一个长度为3的一维数组来表示圆盘的位置及其叠放关系:int[] platePosition{a,b,c},其中,a表示最大的圆盘的位置,c表示最小的圆盘的位置,a,b,c的取值可以为1,2,或3,分别代表某个圆盘所在的柱子。请填写下列程序的空缺部分,以使程序能够得到一种移动方案。
public class test{
static int[] si={1,1,1};
static node startNode=new node(null,si);
static int[] ei={3,3,3};
static node endNode=new node(null,ei);
static Vector nodeList=new Vector( ); //记录已经走过的节点
public static void main(String[] args){
node leaf=depthFirstSearch(startNode);
}
public static node depthFirstSearch(node curNode){ //深度优先
if(______) return (______) ;
nodeList.add(curNode);
curNode.setSons(nodeList);
node[] sons=curNode.getSons();
if(sons==null) return null;
;
}
class node{
int depth;
node father;
node[] sons=null;
int[] platePosition=new int[3];
node(node father,int[] platePosition){
this.father=father;
if(this.father==null) this.depth=1;
else this.depth=this.father.depth+1;
for(int i=0;i<this.platePosition.length;i++)
this.platePosition[i]=platePosition[i];
}
public void setSons(Vector nodeList){
Vector v=new Vector();
//移动最大的圆盘
if(platePosition[0]!=platePosition[1] && platePosition[0]!=platePosition[2] &&
platePosition[1]==platePosition[2]){
int[] p={______};
v.add(new node(this,p));
}
//移动第二大的圆盘
if(platePosition[1]!=platePosition[2]){
int[] p={ ______ };
v.add(new node(this,p));
}
//移动最小的圆盘
for(int i=1;i<=3;i++)
if(platePosition[2]!=i){
int[] p={ platePosition[0] , platePosition[1] , i };
v.add(new node(this,p));
}
if(v.size()>0){
//已经走过的节点不允许再走
for(int i=0;i<nodeList.size();i++)
for(int j=0;j<v.size();j++)
if(((node)nodeList.elementAt(i)).equalNode((node)v.elementAt(j)))
______;
this.sons=new node[v.size()];
this.sons=(node[])v.toArray(this.sons);
}
}
public node[] getSons(){
return this.sons;
}
public boolean equalNode(node n){//用于比较两个节点的platePosition 是否相同
for(int i=0;i<3;i++)
if(______) return false;
return true;
}
}
答案不对?请尝试站内搜索