您好,欢迎访问三七文档
1自己用宽度优先算法写的八数码问题,有代码,有注释,有截图中间动态变化过程截图省略……2源代码:EightDigital.javapackageeightDigitalProblem;importjava.util.*;publicclassEightDigital{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstub//EightDigitaled=newEightDigital();//ed.launch();MyFramemf=newMyFrame();mf.launchMyFrame();}publicNodelaunch(int[]startData,int[]endData){//起始结点赋值283164705//结束结点赋值123804765int[]array0=newint[9];Nodes0=newNode(array0);Nodes=newNode(startData);3s.setDepth(0);s.setStep(0);s.setFatherNode(s0);LinkedListNodeopen=newLinkedListNode();//open集合open.add(s);//添加初始点LinkedListNodeclosed=newLinkedListNode();//closed集合Noden;while(true){//循环if(open.isEmpty()){System.out.println(fail);System.exit(0);}n=open.getFirst();if(goal(n,endData)){System.out.println(success);//找到目标结点了break;}closed.add(n);//把结点加入到closed表中open.removeFirst();//删除最前面的结点LinkedListNodem=expand(n);//扩展结点while(!m.isEmpty()){open.add(m.removeFirst());}}//找到目标结点n.display();returnn;}publicbooleangoal(Noden,int[]endData){int[]array=newint[9];//目标结点赋初值array[0]=1;array[1]=2;array[2]=3;array[3]=8;array[4]=0;array[5]=4;4array[6]=7;array[7]=6;array[8]=5;//Nodes=newNode(array);//目标结点Nodes=newNode(endData);//目标结点if(s.equals(n)){returntrue;}else{returnfalse;}}publicLinkedListNodeexpand(Noden){//n结点向外扩展,返回扩展的结点集合LinkedListNodetemp=newLinkedListNode();intzeroPosition=n.getZeroPosition(n);//记录0(空格)的位置if(rightMove(zeroPosition)){//空格可以向右移动NodenewNode=newNode(n);//创造一个新结点newNode.getArray()[zeroPosition]=newNode.getArray()[zeroPosition+1];//空格右移newNode.getArray()[zeroPosition+1]=0;if(!n.getFatherNode().equals(newNode)){//新产生的结点不能是结点n的父节点temp.add(newNode);//将新结点添加到集合newNode.setFatherNode(n);//设置新结点的父结点newNode.setStep(n.getStep()+1);//设置新结点到此走过的步长newNode.setDepth(newNode.getFatherNode().getDepth()+1);//设置深度}}if(leftMove(zeroPosition)){//空格可以向左移动NodenewNode=newNode(n);//创造一个新结点newNode.getArray()[zeroPosition]=newNode.getArray()[zeroPosition-1];//空格左移newNode.getArray()[zeroPosition-1]=0;if(!n.getFatherNode().equals(newNode)){//新产生的结点不能是结点n的父节点temp.add(newNode);//将新结点添加到集合5newNode.setFatherNode(n);//设置新结点的父结点newNode.setStep(n.getStep()+1);//设置新结点到此走过的步长newNode.setDepth(newNode.getFatherNode().getDepth()+1);//设置深度}}if(upMove(zeroPosition)){//空格可以向上移动NodenewNode=newNode(n);//创造一个新结点newNode.getArray()[zeroPosition]=newNode.getArray()[zeroPosition-3];//空格上移newNode.getArray()[zeroPosition-3]=0;if(!n.getFatherNode().equals(newNode)){//新产生的结点不能是结点n的父节点temp.add(newNode);//将新结点添加到集合newNode.setFatherNode(n);//设置新结点的父结点newNode.setStep(n.getStep()+1);//设置新结点到此走过的步长newNode.setDepth(newNode.getFatherNode().getDepth()+1);//设置深度}}if(downMove(zeroPosition)){//空格可以向下移动NodenewNode=newNode(n);//创造一个新结点newNode.getArray()[zeroPosition]=newNode.getArray()[zeroPosition+3];//空格下移newNode.getArray()[zeroPosition+3]=0;if(!n.getFatherNode().equals(newNode)){//新产生的结点不能是结点n的父节点temp.add(newNode);//将新结点添加到集合newNode.setFatherNode(n);//设置新结点的父结点newNode.setStep(n.getStep()+1);//设置新结点到此走过的步长newNode.setDepth(newNode.getFatherNode().getDepth()+1);//设置深度}}returntemp;}publicbooleanrightMove(intp){//判断能否空格能否向右移动if(p%3==2){//第3列不能往右移动了,第3列除以3的余数为2returnfalse;6}else{//第1,2列可以向右移动returntrue;}}publicbooleanleftMove(intp){//判断能否空格能否向左移动if(p%3==0){//第0列不能往左移动了,第1列除以3的余数为0returnfalse;}else{//第2,3列可以向左移动returntrue;}}publicbooleanupMove(intp){if(p3){//第一行p=0,1,2不能往上移动了returnfalse;}else{//第2,3行可以向上移动returntrue;}}publicbooleandownMove(intp){if(p5){//第3行p=6,7,8不能向下移动了returnfalse;}else{//第1,2行可以向下移动returntrue;}}publicLinkedListNodesortByDepth(LinkedListNodelist){LinkedListNodetemp=newLinkedListNode();while(!list.isEmpty()){NodedeepestNode=list.getFirst();IteratorNodeite=list.iterator();while(ite.hasNext()){Nodenode=ite.next();if(node.getDepth()deepestNode.getDepth()){deepestNode=node;}}temp.add(deepestNode);list.remove(deepestNode);}7returntemp;}}MyFrame.javapackageeightDigitalProblem;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.*;importjava.awt.*;importjava.util.Stack;publicclassMyFrameextendsJFrameimplementsActionListener{privatestaticfinallongserialVersionUID=1L;privateJMenuBarjmenubar;privateJMenujmenu1;privateJMenujmenu2;privateJMenuItemjmenuitem1;privateJMenuItemjmenuitem2;privateJPaneljpanel1;privateJPaneljpanel2;privateJPaneljpanel3;privateJPaneljpanel4;privateJLabeljlabel1;//初始值privateJLabeljlabel2;//结束值privateJLabeljlabel3;//提示privateJLabeljlabel4;//提示privateJTextFieldjtextfield1;privateJTextFieldjtextfield2;privateJTextFieldjtextfield3;privateJLabell1;privateJLabell2;privateJLabell3;privateJLabell4;privateJLabell5;privateJLabell6;privateJLabell7;8privateJLabell8;privateJLabell9;privateFontfont;privateFontfont2;HelpFramehelpFrame;MyFrame(){jmenubar=newJMenuBar();jmenu1=newJMenu(选择算法);jmenu2=newJMenu(帮助);jmenuitem1=newJMenuItem(宽度优先);jmenuitem2=newJMenuItem(使用说明);jpanel1=newJPanel();jpanel2=newJPanel();jpanel3=newJPanel();jpanel4=newJPanel();jlabel1=newJLabel(初始值:,JLabel.CENTER);jlabel2=newJLabel(结束值:,JLabel.CENTER);jlabel3=newJLabel(,JLabel.LEFT);//提示jlabel4=n
本文标题:八数码问题源代码
链接地址:https://www.777doc.com/doc-2657857 .html