//8数码类 class Eight{ int e[][] = {{2,8,3},{1,6,4},{7,0,5}}; //默认的起始状态 int faX ,faY; //保存父状态中0的位置 int f; //估价函数值 Eight former ;
public Eight(){ faX = -1; faY=-1; f=-1; former = null; }
public Eight(Eight other){ for(int i = 0; i<3; i++) for(int j=0 ;j<3; j++){ e[i][j] = other.e[i][j]; } faX = other.faX; faY = other.faY; f = other.f; former = other.former; }
public void print() { for(int i1 = 0;i1<3;i1++) for(int j1=0;j1<3;j1++){ System.out.print(e[i1][j1]); if(j1==2) System.out.println(); } System.out.println(); }
public void listAll( Eight e ){ while( e.former != null ){ e.former.print(); e = new Eight(e.former); } return ; }
}
class Queue extends Object{ //队列类 private int size = 0; Eight qe[] = new Eight[20];
public void print(){ for(int i=0;i<size;i++) qe[i].print(); }
public void addElement(Eight e){ qe[size] = e; size++; }
public boolean contains(Eight e){ if( size == 0 ) return false; else{ for(int i=0;i<size;i++){ if(qe[i].equals(e)) return true; } } return false; }
public boolean isEmpty(){ if (size == 0) { return true; } else return false; }
public Eight elementAt(int index){
return qe[index]; }
public void setElementAt( Eight e,int index ){
qe[index] = e; }
public int size(){ return size; }
public int indexOf (Eight e) { for (int i = 0; i < size; i++){ if (qe[i].equals( e )) return i; } return -1; }
public void removeFirst( ){ for(int i=0;i<size;i++){ qe[i] = qe[i+1]; } size--; }
public void remove( Eight e ){ for( int i = 0; i < size; i++ ){ if( qe[i].equals( e )) qe[i] = null; } size--; }
public void removeAllElements(){ for (int i = 0; i < size; i++){ qe[i] = null; } size = 0; }
}
//算法实现类 public class Asearch{ static int dest[][] = {{1,2,3},{8,0,4},{7,6,5}};
static void Swap(Eight ee,int i,int j,int m,int n){ int temp; temp = ee.e[i][j]; ee.e[i][j] = ee.e[m][n]; ee.e[m][n] = temp; }
static int compare(Eight a){ int h =0,i,j; for(i=0;i<3;i++) for(j=0;j<3;j++){ if(a.e[i][j]!=dest[i][j]) h++; } return h; } //生成子状态 static Queue born(Eight e){ int m=1,n=1,i=0,j=0; boolean flag = true; Queue sons = new Queue(); for(i=0;i<3&&flag;i++) for(j=0;j<3&&flag;j++){ if(e.e[i][j]==0){ flag=false; break; } } i--; if(i-1>=0){ m=i-1; if(m!=e.faX){ Swap(e,m,j,i,j); //e.print();
Eight son1 = new Eight(e); son1.faX = i; son1.faY = j; son1.former = e; sons.addElement(son1); Swap(e,i,j,m,j);
} } if(i+1<3){ m=i+1; if(m!=e.faX){ Swap(e,m,j,i,j); //e.print(); Eight son2 = new Eight(e); son2.faX = i; son2.faY = j; son2.former = e; sons.addElement(son2); Swap(e,i,j,m,j); }
} if(j-1>=0){ n=j-1; if(n!=e.faY){ Swap(e,i,n,i,j); //e.print(); Eight son3 = new Eight(e); son3.faX = i; son3.faY = j; son3.former = e; sons.addElement(son3); Swap(e,i,j,i,n); }
} if(j+1<3){ n=j+1; if(n!=e.faY){ Swap(e,i,n,i,j); //e.print(); Eight son4 = new Eight(e); son4.faX = i; son4.faY = j; son4.former = e; sons.addElement(son4); Swap(e,i,j,i,n); }
} return sons; } public static void main(String[] args){ int depth=0; //深度 Eight n = new Eight() ; Eight temp1 = new Eight() , temp2 = new Eight() ; //open表 Queue open = new Queue(); //closed表 Queue closed = new Queue(); //保存子状态的表 Queue son = new Queue(); open.addElement(n);
while(!open.isEmpty()){ n= open.elementAt(0); open.removeFirst( ); if(compare(n)==0){ n.listAll(n); System.out.println("Success!"); return; } son = born(n); depth++; int count = son.size(); if(count==0) continue; else for(int t=0;t<count;t++){ temp1 = son.elementAt(t); if(!open.contains(temp1)&&!closed.contains(temp1)){ temp1.f = depth + compare(temp1); open.addElement(temp1); } else if(open.contains(temp1)){ temp1.f = depth + compare(temp1); int pos = open.indexOf(son.elementAt(t)); temp2 = open.elementAt(pos); if(temp1.f<temp2.f){ open.setElementAt(temp1,pos); } } else if(closed.contains(temp1)){ temp1.f = depth + compare(temp1); int pos = closed.indexOf(temp1); temp2 = closed.elementAt(pos); if( temp1.f<temp2.f ){ closed.remove(son.elementAt(t)); open.addElement(temp1); } } }//end for closed.addElement(n); for(int i=open.size()-1;i>0;i--) for(int j=0;j<i;j++){ temp1 = (Eight)open.elementAt(j); temp2 = (Eight)open.elementAt(j+1); if(temp1.f>temp2.f){ Eight tq=new Eight(); tq = open.elementAt(j); open.setElementAt(open.elementAt(j+1),j); open.setElementAt(tq,j+1); } } }//end while System.out.println("Fail!"); return; }//end main }
这个程序是实现人工智能中的A*算法,照着书上的算法做的。Queue类是自己写的一个队列类,用来实现open表和closed表。原来用Vector做的,但后来发现Vector中保存的只是引用,生成子状态后表中的状态也跟着变了,只好自己实现一个队列类。现在知道还有个LinkedList类可以胜任这项工作,不过作业都交了,我也懒得改了! 
|