2017-07-31 63 views
2

我有通過整個基質移動片在隨機位置X:如何從某個位置開始迭代2d數組?

在每個新的位置I它在該位置進行比較的值(爲簡單起見在基質中的唯一部分是X)。雖然這樣做會很容易,如果X開始爲0,但在我的情況下,X片可在矩陣中的任何位置開始,現在我剛開始用這個循環:

for(int i = row_x;i<rows;i++) 
    for(int j = col_x;j<cols;j++) 
     //do something 

但這樣做只會讓我訪問某些領域:vistied fields sample

,我需要訪問所有的領域突出了這樣的畫面:required

那麼這將是解決它的最簡單的方法?

回答

4

你應該檢查它是否是的第一次迭代外環:

for(int i = row_x; i < rows; i++) 
    for(int j = (i == row_x ? col_x : 0); j < cols; j++) 
    //do something 
+0

謝謝,這是一個很好的答案。 –

2

一個解決辦法是改變你的二維數組結構到一維數組和工作在1D(不通過算法),然後再應用此:

init = rows*i+j; 

for(int l = init; l<size;i++){ 
    //do things 
} 
+1

「_你也會獲得更好的算法複雜度(O(n)而不是O(n²))_」這句話有誤導性。此外,你忘了你已經花時間將二維數組轉換爲1D。如果矩陣的維數爲'N×N',其中'N = 8',那麼在最壞的情況下,你有2D'O(8²)'。如果你先把它轉換成1D,那你就是在用'O(8²)'來轉換它。然後你訪問的是一維數組,在最壞的情況下...'O(8×8)= O(8²)'...所以如果你使用'〜'表示法(2D:'〜 O(8²)'vs 1D:'〜2 O(8²)') – KarelG

+0

@Flown好吧!感謝您的解釋。 – Calips

+0

@KarelG我不是故意用算法來做轉換,而只是一個建議讓他在一維數組上工作,而不是二維數組,如果沒有必要的話。並感謝評論。 – Calips

0

不要啓動內循環(循環從col_x列迭代,但是從第0 指數(第一列),這將覆蓋required

給出的領域。 0
+0

您可以提供一個代碼示例或將此答案作爲評論。 – KarelG