当前学科:电气安全
  • 题目: 未知类型

      有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;

        }

        }

    答案: <查看本题扣1积分>

    查看答案

    答案不对?请尝试站内搜索