2016-12-08 4 views
0

多くのありがとう。私は学術的な仕事(nチェスクイーンズ)を開発することを混乱させる、すべての再帰的なスレッドが正しい結果を生成するが、私はArrayListの中にソリューション(行列の列の整数の配列)を格納しようとしているが、問題は、arraylistのadd()メソッドがarraylistの内容を置き換える代わりに、新しいものを追加することです。これはインスタンス関連の問題だと思いますが、どうやって解決するのか分かりません。私の貧弱なJavaレベルのため、確かにばかげた愚かな事実です。本当にありがとうございました!java arraylist add replace代わりに

package preda2.package_Preda_Reinas; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Iterator; 

public class Vuelta_atras_reinas { 

    ArrayList<Integer[]> vector_solucion = new ArrayList<>(); 

    public void reinas(Integer s[],Integer n,Integer k) {     
     s[k] = 0; 
     while (s[k]<= n-1) 
     { 
      s[k]++;   
      if(computable(s,k)) 
      {    
       if(k==(n-1)) 
       {      
        vector_solucion.add(s);      
        System.out.println("solución encontrada: "+Arrays.toString(s));      
        for(int i=0;i<vector_solucion.size();i++) 
        { 
         System.out.println("Size: "+vector_solucion.size()+" ["+i+"]"+Arrays.toString((Integer[]) vector_solucion.get(i))); 
        }      
       } 
       else reinas(s,n,k+1); 
      }    
     }   
    } 
    public boolean computable(Integer s[],Integer k) 
     {   
      for(Integer i=0;i<=k-1;i++) 
      { 
      // System.out.println("s[i] es "+s[i]+" s[k] es "+s[k]+" Math.abs(s[i]-s[k])es "+Math.abs(s[i]-s[k])+" Math.abs(i-k) es "+Math.abs(i-k)); 
       if(s[i] == s[k] || (Math.abs(s[i]-s[k])==Math.abs(i-k))) 
        return false; 
      } 
      return true; 
     }  

} 

私はsentecesと他のクラスのメソッドmainから関数reinasを呼び出す:

Vuelta_atras_reinas Vuelta_atras_reinas_Bi = new Vuelta_atras_reinas();   
Integer s[]= new Integer[4]; 
Vuelta_atras_reinas_Bi.reinas(s,4,0); 

そして結果は以下のとおりです。

solución encontrada: [2, 4, 1, 3] 
Size: 1 [0][2, 4, 1, 3] 
solución encontrada: [3, 1, 4, 2] 
Size: 2 [0][3, 1, 4, 2] <--- It must be [2,4,1,3] 
Size: 2 [1][3, 1, 4, 2] 

答えて

2

あなたが絶えずに同じ、独特の配列を追加していますリスト。したがって、リスト内の同じ配列へのN個の参照で終わります。

すべての中間値を覚えておきたい場合は、リストに追加する前に配列のコピーを作成する必要があります。

+0

速い応答のためのタク、前にそれをやろうとしましたが、私はそれをひどくやっています。私は: 整数s_local [] =新しい整数[n]を; s_local = s; vector_solucion.add(s_local); –

+0

これは、nullで埋められた新しい配列を作成し、それを変数s_localに代入し、元の配列への参照をs_localに代入することによって破棄します。コピーは一切作成されていません。 Googleの「Javaで配列のコピーを作成する方法」については、最初のリンクをクリックして読んでください。 –

+0

多くのおかげです。 s_local = s.clone();解決策はありましたか? –

関連する問題