2013-12-20 41 views
0

我試圖做一個Java程序,它給我的8puzzle問題的解決NoSuchElementException異常在8Puzzle求解

求解過程如下所示:

- 首先我創建初始節點包含初始網格(初始狀態)

  • 我把節點在隊列

  • 我測試,如果該節點是一個目標,所以我使用第È棧保存溶液道路(從節點到初始根)

別的我將添加他的繼任者(其表示0的可能的排列)在隊列中,我重做試驗。

這是代碼: 類Noued

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.Queue; 


public class Noued { 
int grille[]=new int[9]; 
int niveau; 

Noued suiv1=null; 
Noued suiv2=null; 
Noued suiv3=null; 
Noued suiv4=null; 
Noued pred=null; 


static void successeur(Noued r) 
{Queue<Integer> permut; 
Integer elt; 

    permut=taquin8.Test_permut(taquin8.zero(r.grille)); 

    if(permut.element()!=null){ 
     elt=permut.remove(); 
     r.suiv1=new Noued(); 
     r.suiv1.pred=r; 
     for(int i=0;i<9;i++){r.suiv1.grille[i]=r.grille[i];} 
     r.suiv1.niveau=r.niveau+1; 
    r.suiv1.grille[taquin8.indice_ent(r.suiv1.grille,0)]=r.suiv1.grille[elt]; 
    r.suiv1.grille[elt]=0; 

    if(permut.element()!=null){ 
     elt=permut.remove(); 
     r.suiv2=new Noued(); 
     r.suiv2.pred=r; 
     for(int i=0;i<9;i++){r.suiv2.grille[i]=r.grille[i];} 
     r.suiv2.niveau=r.niveau+1; 
     r.suiv2.grille[taquin8.indice_ent(r.suiv2.grille,0)]=r.suiv2.grille[elt]; 
     r.suiv2.grille[elt]=0; 


    } 

    if(permut.element()!=null){ 
     elt=permut.remove(); 
     r.suiv3=new Noued(); 
     r.suiv3.pred=r; 
     for(int i=0;i<9;i++){r.suiv3.grille[i]=r.grille[i];} 
     r.suiv3.niveau=r.niveau+1; 
     r.suiv3.grille[taquin8.indice_ent(r.suiv3.grille,0)]=r.suiv3.grille[elt]; 
     r.suiv3.grille[elt]=0; 

     if(permut.element()!=null){ 
      elt=permut.remove(); 
      r.suiv4=new Noued(); 
      r.suiv4.pred=r; 
      for(int i=0;i<9;i++){r.suiv4.grille[i]=r.grille[i];} 
      r.suiv4.niveau=r.niveau+1; 
      r.suiv4.grille[taquin8.indice_ent(r.suiv4.grille,0)]=r.suiv4.grille[elt]; 
      r.suiv4.grille[elt]=0; 


     }  
    } 
    } 
} 




//afficher un arbre 
static void affich_ab(Noued r) 
{ 
if(r!=null){taquin8.affichertab(r.grille);} 
if(r.suiv1!=null){System.out.println("\n***S1***"); affich_ab(r.suiv1);} 
if(r.suiv2!=null){System.out.println("\n***S2***"); affich_ab(r.suiv2);} 
if(r.suiv3!=null){System.out.println("\n***S3***"); affich_ab(r.suiv3);} 
if(r.suiv4!=null){System.out.println("\n***S4***"); affich_ab(r.suiv4);}  

} 

} 

類Taquin8:

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.Queue; 
import java.util.Stack; 


public class taquin8 { 
static Integer n1,n2; 
static int start[] = {1,2,3,4,0,5,7,8,6}; 
static int goal[] = {1,2,3,4,5,6,7,8,0}; 


    //affichage d'une grille  
    static void affichertab(int t[]) 
    { 
     for (int i=0;i<9;i++){ 
      if ((i%3)==2){System.out.println("["+t[i]+"]");} 
      else {System.out.print("["+t[i]+"]");} 
           } 

    } 
    //rechercher l'indice d'un entier 
    static int indice_ent(int t[],int x) 
    {int ind = 10; 
     for (int i=0;i<9;i++){ 
      if (t[i]==x) ind=i; 
     } 
     return ind; 

    } 

    //rechercher l'indice de zero 
    static int zero(int t[]) 
    {int ind = 10; 
     for (int i=0;i<9;i++){ 
      if (t[i]==0) ind=i; 
     } 
     return ind; 

    } 

    //egalité de tableau 
     static boolean egal_tab(int t1[],int t2[]) 
     {int c=0; 
      for (int i=0;i<9;i++){ 
       if (t1[i]!=t2[i]) c++; 
      } 
      if (c==0) {return true;} 
      else return false; 

     } 

    //procedure pour faire la permutation de deux entier 

    static void permutaion(Integer n1, Integer n2) 
    {Integer t; 
    t=n1; 
    taquin8.n1=n2; 
    taquin8.n2=t; 
    } 



    //Test pour les possibilites de permutaion de 0 
    static Queue<Integer> Test_permut(int g) 
    { 
     Queue<Integer> pp = new LinkedList<Integer>(); 


    switch (g) 
    { 
    case 0: 
    { 
     pp.add(1); 
     pp.add(3); 
    break;} 

    case 1: 
    { 
     pp.add(0); 
     pp.add(2); 
     pp.add(4); 
    break;} 


    case 2: 
    { 
     pp.add(1); 
     pp.add(5); 
    break;} 

    case 3: 
    { 
     pp.add(0); 
     pp.add(4); 
     pp.add(6); 

    break;} 

    case 4: 
    { 
     pp.add(1); 
     pp.add(3); 
     pp.add(5); 
     pp.add(7); 

    break;} 

    case 5: 
    { 
     pp.add(2); 
     pp.add(4); 
     pp.add(8); 

    break; 
    } 

    case 6: 
    { 
    pp.add(3); 
    pp.add(7); 
    break;} 

    case 7: 
    { 
    pp.add(4); 
    pp.add(6); 
    pp.add(8); 

    break;} 

    case 8: 
    { 
    pp.add(5); 
    pp.add(7); 
    break;} 
    default:{};    
    } 

     return pp; 
    } 

static //largeur 
    ArrayList<Noued> largeur(Noued r,ArrayList<Noued> f) 
    { 

     f=new ArrayList<Noued>(); 


    f.add(r); 

if(!taquin8.egal_tab(r.grille,goal)){ 
    Noued.successeur(r); 
if(r.suiv1!=null){f.add(r.suiv1);} 
if(r.suiv2!=null){f.add(r.suiv2);} 
if(r.suiv3!=null){f.add(r.suiv3);} 
if(r.suiv4!=null){f.add(r.suiv4);} 
} 


return f; 


    } 







    //Programme Principal 
    public static void main(String[] args) { 
     Queue<Noued> queue = new LinkedList<Noued>(); 
     Stack<Noued> sol = new Stack<Noued>(); 

Noued rac=new Noued(); 
rac.grille=start; 
rac.niveau=0; 


queue.add(rac); 

int but=0; 

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXtest la file le but 






while(but==0){ 
    Noued t=queue.element(); 
if(t.grille.equals(goal)){System.out.println("LE BUUUUUUUUUUUUt"); 
               Noued emp=t; 
               while(emp.pred!=null){ 
                     sol.push(emp); 
                     emp=emp.pred; 
                     } 
               but=1; 

                  } 




else{Noued.successeur(t); 
if(t.suiv1!=null){queue.add(rac.suiv1);} 
if(t.suiv2!=null){queue.add(rac.suiv2);} 
if(t.suiv3!=null){queue.add(rac.suiv3);} 
if(t.suiv4!=null){queue.add(rac.suiv4);} 
} 
queue.remove(); 
} 
//affichage de la frontiere 
/* 
if(queue!=null){ 
while(queue.size()!=0){ 
        taquin8.affichertab(queue.remove().grille); 
        System.out.println("\n"); 
        } 

} 

*/ 


if(sol!=null){ 
while(sol.size()!=0){ 
        taquin8.affichertab(sol.pop().grille); 
        System.out.println("\n"); 
        } 

}   




    } 
} 

的結果是這樣的:


Exception in thread "main" java.util.NoSuchElementException 
    at java.util.LinkedList.getFirst(Unknown Source) 
    at java.util.LinkedList.element(Unknown Source) 
    at Noued.successeur(Noued.java:53) 
    at taquin8.main(taquin8.java:208) 
+0

請在這裏與您的問題張貼代碼。 –

+0

請不要在外部鏈接添加代碼 –

+0

好吧,它已完成:) – user3101913

回答

1

從您的堆棧跟蹤,它看起來是t permut後面的LinkedList隊列是空的。也就是說,permut是空的。看看Noued.successeur,我們看到permut來自taquin8.Test_permut()。看看Taquin8.Test_permut,我們看到default大小寫返回一個空的隊列。所以,你需要弄清楚爲什麼taquin8.Test_permut正在進入默認情況。提示:g超出範圍[0:8]。

我建議通過調試器運行您的代碼,或者至少添加一些println語句。

+0

+1。 Java在IDE中有一些偉大的符號調試器。學習並愛他們! –

0

好吧,我解決了先例問題。

但現在我有一個「無限循環」(Taquin8類) 它看起來正確的形式(阿爾戈方) 我不知道問題在哪裏!

類Noued:

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.Queue; 


public class Noued { 
int grille[]=new int[9]; 
int niveau; 
int vis; 
Noued suiv1=null; 
Noued suiv2=null; 
Noued suiv3=null; 
Noued suiv4=null; 
Noued pred=null; 

static void successeur(Noued r) 
{Queue<Integer> permut; 
Integer elt; 

    permut=taquin8.Test_permut(taquin8.zero(r.grille)); 
    if(permut!=null){ 

    if(!permut.isEmpty()){ 
     elt=permut.element(); 
     r.suiv1=new Noued(); 
     r.suiv1.pred=r; 
     for(int i=0;i<9;i++){r.suiv1.grille[i]=r.grille[i];} 
     r.suiv1.niveau=r.niveau+1; 
    r.suiv1.grille[taquin8.indice_ent(r.suiv1.grille,0)]=r.suiv1.grille[elt]; 
    r.suiv1.grille[elt]=0; 



    permut.remove(); 
    if(!permut.isEmpty()){ 
     elt=permut.element(); 
     r.suiv2=new Noued(); 
     r.suiv2.pred=r; 
     for(int i=0;i<9;i++){r.suiv2.grille[i]=r.grille[i];} 
     r.suiv2.niveau=r.niveau+1; 
    r.suiv2.grille[taquin8.indice_ent(r.suiv2.grille,0)]=r.suiv2.grille[elt]; 
    r.suiv2.grille[elt]=0; 



    permut.remove(); 
if(!permut.isEmpty()){ 
     elt=permut.element(); 
     r.suiv3=new Noued(); 
     r.suiv3.pred=r; 
     for(int i=0;i<9;i++){r.suiv3.grille[i]=r.grille[i];} 
     r.suiv3.niveau=r.niveau+1; 
    r.suiv3.grille[taquin8.indice_ent(r.suiv3.grille,0)]=r.suiv3.grille[elt]; 
    r.suiv3.grille[elt]=0; 


    permut.remove(); 
if(!permut.isEmpty()){ 
     elt=permut.element(); 
     r.suiv4=new Noued(); 
     r.suiv4.pred=r; 
     for(int i=0;i<9;i++){r.suiv4.grille[i]=r.grille[i];} 
     r.suiv4.niveau=r.niveau+1; 
    r.suiv4.grille[taquin8.indice_ent(r.suiv4.grille,0)]=r.suiv4.grille[elt]; 
    r.suiv4.grille[elt]=0; 



    permut.remove(); 

    } 
    } 
    } 


    } 




}else{System.out.println("\n PERMUT IS EMPTY");} 
} 
//afficher un arbre 
static void affich_ab(Noued r) 
{ 
if(r!=null){taquin8.affichertab(r.grille);} 
if(r.suiv1!=null){System.out.println("\n***S1***"); affich_ab(r.suiv1);} 
if(r.suiv2!=null){System.out.println("\n***S2***"); affich_ab(r.suiv2);} 
if(r.suiv3!=null){System.out.println("\n***S3***"); affich_ab(r.suiv3);} 
if(r.suiv4!=null){System.out.println("\n***S4***"); affich_ab(r.suiv4);}  

} 

} 

類Taquin8:

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.Queue; 
import java.util.Stack; 


public class taquin8 { 
static Integer n1,n2; 
static int start[] = {1,2,3,4,5,6,7,0,8}; 
static int goal[] = {1,2,3,4,5,6,7,8,0}; 


    //affichage d'une grille  
    static void affichertab(int t[]) 
    { 
     for (int i=0;i<9;i++){ 
      if ((i%3)==2){System.out.println("["+t[i]+"]");} 
      else {System.out.print("["+t[i]+"]");} 
           } 

    } 
    //rechercher l'indice d'un entier 
    static int indice_ent(int t[],int x) 
    {int ind = 10; 
     for (int i=0;i<9;i++){ 
      if (t[i]==x) ind=i; 
     } 
     return ind; 

    } 

    //rechercher l'indice de zero 
    static int zero(int t[]) 
    {int ind = 10; 
     for (int i=0;i<9;i++){ 
      if (t[i]==0) ind=i; 
     } 
     return ind; 

    } 

    //egalité de tableau 
     static boolean egal_tab(int t1[],int t2[]) 
     {int c=0; 
      for (int i=0;i<9;i++){ 
       if (t1[i]!=t2[i]) c++; 
      } 
      if (c==0) {return true;} 
      else return false; 

     } 

    //procedure pour faire la permutation de deux entier 

    static void permutaion(Integer n1, Integer n2) 
    {Integer t; 
    t=n1; 
    taquin8.n1=n2; 
    taquin8.n2=t; 
    } 



    //Test pour les possibilites de permutaion de 0 
    static Queue<Integer> Test_permut(int g) 
    { 
     Queue<Integer> pp = new LinkedList<Integer>(); 


    switch (g) 
    { 
    case 0: 
    { 
     pp.add(1); 
     pp.add(3); 
    break;} 

    case 1: 
    { 
     pp.add(0); 
     pp.add(2); 
     pp.add(4); 
    break;} 


    case 2: 
    { 
     pp.add(1); 
     pp.add(5); 
    break;} 

    case 3: 
    { 
     pp.add(0); 
     pp.add(4); 
     pp.add(6); 

    break;} 

    case 4: 
    { 
     pp.add(1); 
     pp.add(3); 
     pp.add(5); 
     pp.add(7); 

    break;} 

    case 5: 
    { 
     pp.add(2); 
     pp.add(4); 
     pp.add(8); 

    break; 
    } 

    case 6: 
    { 
    pp.add(3); 
    pp.add(7); 
    break;} 

    case 7: 
    { 
    pp.add(4); 
    pp.add(6); 
    pp.add(8); 

    break;} 

    case 8: 
    { 
    pp.add(5); 
    pp.add(7); 
    break;} 
    default:{};    
    } 

     return pp; 
    } 

//largeur 







    //Programme Principal 
    public static void main(String[] args) { 
     Queue<Noued> queue = new LinkedList<Noued>(); 
     Stack<Noued> sol = new Stack<Noued>(); 

Noued rac=new Noued(); 
rac.grille=start; 
rac.niveau=0; 

int but=0; 
queue.add(rac); 

while((but!=1)&&(!queue.isEmpty())){ 
             Noued test=queue.element(); 
             System.out.println("\n---------"); 
             taquin8.affichertab(test.grille); 

             if(test.grille.equals(goal)){ 
                     System.out.println("GOAAAAAAL"); 
                     but=1; 
                    } 
             else{ 
               Noued.successeur(test); 
               if(test.suiv1!=null){queue.add(test.suiv1);} 
               if(test.suiv2!=null){queue.add(test.suiv2);} 
               if(test.suiv3!=null){queue.add(test.suiv3);} 
               if(test.suiv4!=null){queue.add(test.suiv4);} 
              } 

             queue.remove(); 
            } 


    } 
} 
+0

如果(Arrays.equals(test.grille,goal))System.out.println(「GOAAAAAAL」) .... – user3101913

相關問題