2016-12-08 4 views
0

대단히 감사합니다. 나는 학문적 인 연구 (n 개의 체스 퀸즈)를 개발하는 것을 혼란 스럽다. 모든 재귀 적 쓰레드는 정확한 결과를 생성하지만 ArrayList에 솔루션 (행 수가있는 정수의 배열)을 저장하려고하는데, 문제는 arraylist의 메소드 add()가 arraylist의 내용을 대신 대신 새로 추가한다고 가정합니다. 인스턴스 관련 문제라고 생각하지만 어떻게 해결해야할지 모르겠습니다. 내 가난한 자바 수준 때문에 바보 같은 사실이 틀림 없습니다. 정말 많이 보셔 주셔서 감사합니다 !! !!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 다른 클래스의 메소드 주에서 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(); 해결책 이었습니까 !!!. –