📄 enumber.java
字号:
/* * @author (林剑锋) * @ID 038054132*/import java.util.*;import java.io.*;class Node //定义节点{ int id[][]; //一个节点中所存的九个数值的位置情况 int p=-1; int value; public Node() { id=new int[3][3]; }} public class eNumber{ int step=0; int index; int b; Node First=new Node();// 存储初始状态节点的数值顺序 Node End=new Node();//目标状态 LinkedList closeList=new LinkedList();//存储已经扩展的节点 LinkedList openList=new LinkedList();//存储待扩展的节点 LinkedList templeList=new LinkedList();//存放扩展出来的新节点//--------------------------------------------------------------------------------- public eNumber() { First.id[0][0]=1; First.id[0][1]=0; First.id[0][2]=3; First.id[1][0]=7; First.id[1][1]=2; First.id[1][2]=4; First.id[2][0]=6; First.id[2][1]=8; First.id[2][2]=5; End.id[0][0]=1; End.id[0][1]=2; End.id[0][2]=3; End.id[1][0]=8; End.id[1][1]=0; End.id[1][2]=4; End.id[2][0]=7; End.id[2][1]=6; End.id[2][2]=5; } //------------------------------------------------------------------------------- public static void main(String[] args) { eNumber en=new eNumber(); System.out.println("请按任意顺序输入'0-8'(如课本示例:1 0 3 7 2 4 6 8 5)"); BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); String str; int n=0; char c; try { //str=input.readLine(); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { //c=str.charAt(n); System.out.print("第"+(n+1)+"个数:"); str=input.readLine(); en.First.id[i][j]=Integer.parseInt(str); //System.out.print(en.First.id[i][j]); n++; } } } catch(IOException e){} en.begin(en.First,en.End); en.end(en.closeList); } // ------------------------判断是否相等----------------------------------------------------- public boolean isEqual(Node fnode,Node lnode) { int n=0; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(fnode.id[i][j]==lnode.id[i][j]) n=n+1; } //System.out.println(n); } if(n==9) return true; else return false; } //---------------------主操作------------------------------------- public void begin(Node First1,Node End1) { if(!isEqual(First1,End1)) { int len=templeList.size(); templeList.clear(); //清空临时表 int n=0; int i=0,j=0; step=step+1; openList.remove(First1); closeList.addLast(First1); int k=0; int h=1; int gg; gg=0; l:while(gg==0) { for( k=0;k<3;k++) { for( h=0;h<3;h++) { if(First1.id[k][h]==0) { gg=-1; continue l; } } } } //System.out.print(k+" "); //System.out.println(h); left(copy(First1),k,h); right(copy(First1),k,h); up(copy(First1),k,h); down(copy(First1),k,h); int Oh=openList.size(); if(Oh>0) { Node minnode=new Node(); minnode=(Node)openList.getFirst(); for(int l=1;l<Oh;l++) { Node compnode=new Node(); compnode=(Node)openList.get(l); if(minnode.value>=compnode.value) minnode=compnode; //找open表中最小的节点 } if(templeList.contains(minnode)) First1.p=1; openList.remove(minnode); if(step<10) begin(minnode,End1); } } else { First1.p=1; closeList.addLast(First1); } } //******************复制节点**************** public Node copy(Node nod) { Node no=new Node(); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { no.id[i][j]=nod.id[i][j]; } } return no; } //--------------------------------------------------------------------------------------------------- public void left(Node node,int x,int y) { int n=0,sum=0; Node tnode=new Node(); //int i,j,a,b; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { tnode.id[i][j]=node.id[i][j]; } } if(y!=0) { node.id[x][y]=node.id[x][y-1]; node.id[x][y-1]=0; if((!closeList.contains(node))&&(!openList.contains(node))&&(!isEqual(tnode,node))) { int y2; for(int x1=0;x1<3;x1++) { for(int y1=0;y1<3;y1++) { for(int x2=0;x2<3;x2++) { if(node.id[x1][y1]==End.id[x2][0]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-0)); break; } if(node.id[x1][y1]==End.id[x2][y1]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-1)); break; } if(node.id[x1][y1]==End.id[x2][2]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-2)); break; } } } } node.value=sum; //System.out.println(sum); openList.addLast(node); } else node=null; } if(node!=null) templeList.addLast(node); } //------------------------------------------------------------------------------------------------------- public void right(Node node,int x,int y) { int n=0,sum=0; Node tnode=new Node(); int i,j,a; for(i=0;i<3;i++) { for(j=0;j<3;j++) { tnode.id[i][j]=node.id[i][j]; } } if(y!=2) { node.id[x][y]=node.id[x][y+1]; node.id[x][y+1]=0; if((!closeList.contains(node))&&(!openList.contains(node))&&(!isEqual(tnode,node))) { int y2; for(int x1=0;x1<3;x1++) { for(int y1=0;y1<3;y1++) { for(int x2=0;x2<3;x2++) { if(node.id[x1][y1]==End.id[x2][0]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-0)); break; } if(node.id[x1][y1]==End.id[x2][y1]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-1)); break; } if(node.id[x1][y1]==End.id[x2][2]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-2)); break; } } } } node.value=sum; //System.out.println(sum); openList.addLast(node); } else node=null; } if(node!=null) templeList.addLast(node); } //------------------------------------------------------------------------------------------------------- public void up(Node node,int x,int y) { int n=0,sum=0; Node tnode=new Node(); int i,j,a,b; for(i=0;i<3;i++) { for(j=0;j<3;j++) { tnode.id[i][j]=node.id[i][j]; } } if(x!=0) { node.id[x][y]=node.id[x-1][y]; node.id[x-1][y]=0; if((!closeList.contains(node))&&(!openList.contains(node))&&(!isEqual(tnode,node))) { int y2; for(int x1=0;x1<3;x1++) { for(int y1=0;y1<3;y1++) { for(int x2=0;x2<3;x2++) { if(node.id[x1][y1]==End.id[x2][0]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-0)); break; } if(node.id[x1][y1]==End.id[x2][y1]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-1)); break; } if(node.id[x1][y1]==End.id[x2][2]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-2)); break; } } } } node.value=sum; //System.out.println(sum); openList.addLast(node); } else node=null; } if(node!=null) templeList.addLast(node); } //------------------------------------------------------------------------------------------------ public void down(Node node,int x,int y) { int n=0,sum=0; Node tnode=new Node(); int i,j,a,b; for(i=0;i<3;i++) { for(j=0;j<3;j++) { tnode.id[i][j]=node.id[i][j]; } } if(x!=2) { node.id[x][y]=node.id[x+1][y]; node.id[x+1][y]=0; if((!closeList.contains(node))&&(!openList.contains(node))&&(!isEqual(tnode,node))) { int y2; for(int x1=0;x1<3;x1++) { for(int y1=0;y1<3;y1++) { for(int x2=0;x2<3;x2++) { if(node.id[x1][y1]==End.id[x2][0]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-0)); break; } if(node.id[x1][y1]==End.id[x2][y1]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-1)); break; } if(node.id[x1][y1]==End.id[x2][2]) { sum=sum+(Math.abs(x1-x2)+Math.abs(y1-2)); break; } } } } node.value=sum; //System.out.println(sum); openList.addLast(node); } else node=null; } if(node!=null) templeList.addLast(node); } //***************输出函数*****************************************************public void end(LinkedList list) { int count=0; int ppt=closeList.size(); for(int v=0;v<ppt;v++) { System.out.println(); Node outnode=(Node)list.get(v); if(outnode.p==1) { count=count+1; System.out.println("第"+count+"步:"); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { System.out.print(outnode.id[i][j]+" "); } System.out.println(); } } } System.out.println("程序执行结束...."); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -