2017-05-05 145 views
-2

我有兩套代碼。一個在CPP中,另一個在java中。這兩套代碼似乎是相同的,但他們給我不同的輸出。我在這裏完全困惑。我對cpp很陌生。請幫忙。CPP和Java給出不同的輸出

CPP代碼:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

int helper(vector<vector<int> > table, int i, int j) { 
    if (i < 0 || j < 0 || i >= 4 || j >= 4) return 0; 
    if (table[i][j] == 1) return 0; 
    if (i == 3 && j == 3) return 1; 

    table[i][j] = 1; 
    return helper(table, i, j+1) + helper(table, i+1, j) + helper(table, i, j-1) + helper(table, i-1, j); 
} 

int main(int argc, char *argv[]) { 
    vector<vector<int> > table; 
    vector<int> x(4,0); 
    for (int i = 0; i < 4; ++i) 
     table.push_back(x); 


    cout << helper(table, 0, 0) << endl; 

    return 0; 
} 

輸出:184 鏈接:http://cpp.sh/2xeee

Java代碼:

public class Solution{ 


    int helper(int[][] table, int i, int j) { 
     if (i < 0 || j < 0 || i >= 4 || j >= 4) return 0; 
     if (table[i][j] == 1) return 0; 
     if (i == 3 && j == 3) return 1; 

     table[i][j] = 1; 
     return helper(table, i, j+1) + helper(table, i+1, j) + helper(table, i, j-1) + helper(table, i-1, j); 
    } 



    public static void main(String[] args){ 
     int[][] table=new int[4][4]; 
     for(int i=0; i<4; i++) 
      for(int j=0; j<4; j++) table[i][j]=0; 
     System.out.println(new Solution().helper(table,0,0)); 
    } 


} 

輸出:2 鏈接:http://ideone.com/e.js/U9X1FX

+0

歡迎來到Stack Overflow!請[參觀](http://stackoverflow.com/tour)以查看網站的工作原理和問題,並相應地編輯您的問題。另請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve) –

+2

*兩組代碼似乎都是相同的* - Java不是C++。只是因爲代碼看起來相同,事實並非如此。 – PaulMcKenzie

+0

你不需要用零填充'table'數組的循環。 Java編號數組總是預先填充0. – Boann

回答

3

在Java中,桌子交給奧雅納r通過引用給幫手。在C++中,每次調用都會複製該表。

爲了使C++的行爲,如Java,改變助手呼籲採取一個參考:

int helper(vector<vector<int> >& table, int i, int j) { 

編輯:爲了使Java行爲像原來的C++代碼,你需要受影響的部分複製的表格。將幫手更改爲:

int helper(int[][] original, int i, int j) { 
    if (i < 0 || j < 0 || i >= 4 || j >= 4) return 0; 
    if (original[i][j] == 1) return 0; 
    if (i == 3 && j == 3) return 1; 

    int[] table = new int[4][]; 
    System.arraycopy(original, 0, table, 0, 4); 
    table[i] = new int[4]; 
    System.arraycopy(original[i], 0, table[i], 0, 4); 

    table[i][j] = 1; 

    return helper(table, i, j+1) + helper(table, i+1, j) + helper(table, i, j-1) + helper(table, i-1, j); 
} 
+0

我如何在這裏使java的行爲像cpp? @Stefan Haustein –

+0

這是更多的工作:在助手中,將表參數重命名爲原始,然後構建一個新表,其中包含從原始複製的所有元素。 –

+0

p.s.你只需要複製,如果你改變表 –