2011-03-15 3 views
0

난 그냥 자바 (오늘) 배우기 시작하는 데 도움이,파이썬에서 자바 8 왕비 문제를 번역 : 필요

날 행사하기 위해, 나는 자바에 파이썬으로 작성된 다음 "8 퀸즈"알고리즘을 번역하고 싶습니다 :

BOARD_SIZE = 8 

def under_attack(col, queens): 
    left = right = col 
    for r, c in reversed(queens): 
     left, right = left-1, right+1 
     if c in (left, col, right): 
      return True 
    return False 

def solve(n): 
    if n == 0: return [[]] 
    print n 
    smaller_solutions = solve(n-1) 
    return [solution+[(n,i+1)] for i in range(BOARD_SIZE) for solution in smaller_solutions if not under_attack(i+1, solution)] 

sols = solve(BOARD_SIZE) 
for answer in sols: 
    print answer 

번역, 나는 정확히 같은 알고리즘을 사용하려면 : "자바"파이썬에서 (나는 생각한다 알고 같은 재귀와 "튜플의리스트 목록"을 사용하지만, 지금은 그냥위한거야 재미)

나는 이것을 썼다 :

import java.util.ArrayList; 

class Queens { 


    public static boolean under_attack(int col, ArrayList<Integer[]> queens) { 
     int left = col, right = col; 
     for(int i=queens.size()-1;i>=0;i--) { 
      int r = queens.get(i)[0]; 
      int c = queens.get(i)[1]; 
      left--; 
      right++; 
      if (c==left || c==col || c==right) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static ArrayList<ArrayList<Integer[]>> solve(int n){ 
     ArrayList<ArrayList<Integer[]>> new_solutions = new ArrayList<ArrayList<Integer[]>>(); 
     if (n==0) { 
      return new_solutions; 
     } 
     ArrayList<ArrayList<Integer[]>> smaller_solutions = solve(n-1); 

     for (int i=0;i<8;i++) { 
      for (ArrayList<Integer[]> solution : smaller_solutions) { 
       if (! under_attack(i+1,solution)) { 
        ArrayList<Integer[]> bigger_solution = (ArrayList<Integer[]>) solution.clone(); 
        Integer [] tuple = new Integer [2]; 
        tuple[0] = n; 
        tuple[1] = i+1;     
        bigger_solution.add(tuple); 
        new_solutions.add(bigger_solution); 
       } 
      } 
     } 
     return new_solutions; 

    } 

    public static void main(String[] args) { 
     System.out.println("Résolution du problème des 8 reines"); 
     ArrayList<ArrayList<Integer[]>> solutions; 
     solutions = solve(8); 
     System.out.format("Nb solutions : %d%n",solutions.size()); 
     for (ArrayList<Integer[]> solution : solutions) { 
      System.out.print("(");   
      for(Integer[] i:solution) { 
       System.out.format("[%d,%d],",i[0],i[1]);    
      } 
      System.out.println(")");   
      System.out.println("==============================");  
     }  
    }  
} 

그러나이 작동하지 않습니다 : 없음 대답은 당신이 생각하는 이유가 있나요

를 발견?

+0

'ArrayList를 학습

행복 코딩 ... 그리고 자바 (당신이 진단의 첫 번째 줄에 메시지를 추가 확인할 수로) 호출되지 않습니다 - 그러지 마. –

+0

그럼 어떻게해야합니까? – Eric

답변

1

python 프로그램과 동일한 코드를 실행하려면 다음과 같이 수정해야합니다.

if (n==0) { 
     return new_solutions; 
    } 

를 작성해야 :하여 solve() 기능의 태초 대신에

if (n==0) { 
     ArrayList<Integer[]> empty = new ArrayList<Integer[]>(); 
     new_solutions.add(empty); 
     return new_solutions; 
    } 

이유는 파이썬에서 이슈 [[]] 오른쪽 빈리스트되지 않는 것입니다? 빈리스트만을 요소로 포함하는 목록입니다. 이것은 정확히 자바 코드의 수정입니다! 그렇지 않으면`재귀가 작동하지 않고 under_attack() 기능은 >

+0

정말 고마워요. 당신 말이 맞아요. 내면의 빈 목록을 잊어 버렸어요. 그것은 outlist의 한 요소입니다. 이제 잘 작동합니다 :)) – Eric

관련 문제