2015-11-06 100 views
0

我有3×3的矩陣,它看起來像查找以矩陣位置

後面的每個數字是一個東西。 所以我寫了這個代碼,它將返回當前矩陣中的哪個位置。但它感覺非常重複,我很好奇是否可以優化這段代碼。如果是這樣,怎麼樣?

public int findPos(int i, int k) { 
    if (i == 0 && k == 0) { 
     return 1; 
    } 
    if (i == 0 && k == 1) { 
     return 2; 
    } 
    if (i == 0 && k == 2) { 
     return 3; 
    } 
    if (i == 1 && k == 0) { 
     return 4; 
    } 
    if (i == 1 && k == 1) { 
     return 5; 
    } 
    if (i == 1 && k == 2) { 
     return 6; 
    } 
    if (i == 2 && k == 0) { 
     return 7; 
    } 
    if (i == 2 && k == 1) { 
     return 8; 
    } 
    if (i == 2 && k == 2) { 
     return 9; 
    } 

    return 0; 
} 

的方法是在這種類型的時裝後應用

if (myMatrix[i][k] == 2) { 
    position = findPos(i, k); 
    drawAtPos(position); 
} 

回答

1

能只能把它隱蔽於:

public int findPos(int i, int k) { 
    if (0 <= i && i < COLUMN_COUNT && 0 <= k && k < row_COUNT){ // out of bounds 
     return 0; 
    } 
    return (i * 3) + (k + 1); 
} 

這一切正在做的是減少你的條件爲數學,因爲每個列向右返回每個位置1的偏移量,並且每行需要增加3.

對於更通用的解決方案,它將是:

public int findPos(int i, int k) { 
    if (0 <= i && i < COLUMN_COUNT && 0 <= k && k < row_COUNT){ // out of bounds 
     return 0; 
    } 
    return (i * COLUMN_COUNT) + (k + 1); 
} 

其中,COLUMN_COUNT是您擁有的列數。因此,將工作的事情,如:

1 2 3 4 5 6 
7 8 9 10 11 12 

其中COLUMN_COUNT = 6

+0

這似乎工作,你能解釋爲什麼嗎? – Michael

1

你可以計算出你的位置:

if (0 <= i && i < 3 && 
     0 <= k && k < 3) {  
    // number of rows passed * size of each row + current column + 1 for 0-to-1-based-conversion 
    return (i * 3) + (k + 1); 
} else { 
    return 0; 
} 
1

什麼是與這事?

(i*3 + k) + 1 

它爲什麼有效?那麼,從你的矩陣中減去1,所以它看起來是這樣的:

0 1 2 
3 4 5 
6 7 8 

所以它應該是顯而易見的。