2011-03-15 62 views
0

我剛開始學習Java(今天),翻譯8個皇后問題從蟒蛇到Java:需要幫助

爲了鍛鍊我,我想下面的「8個皇后」的算法用Python編寫成Java翻譯:

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 

對於翻譯,我想用完全一樣的算法:遞歸和使用「元組的列表的列表」中像蟒蛇(我知道我應該想的「java」,但現在,它只是有趣)

我寫這個:

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 >' - 不要這樣做。 – 2011-03-15 22:56:09

+0

那我該怎麼辦? – Eric 2011-03-16 16:38:35

回答

1

您的代碼運行與python程序完全相同所需的更正如下所示。在solve()功能的開頭,而不是:

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

你應該寫:

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

的原因是,在Python神器[[]]不是一個空的列表,對不對?它是一個包含空白列表元素的列表。這正是java代碼中的修正!否則,遞歸不工作和under_attack()函數沒有被調用(你可以驗證添加在第一線的診斷消息)

快樂編碼...和Java學習

+0

非常感謝你:你是對的,我忘記了內在的空白清單......這是排在前面的一個元素。現在運作良好:)) – Eric 2011-03-21 11:42:27