2017-07-31 2 views
2

私は行列全体をランダムな位置Xに移動しなければなりません:いくつかの位置から2次元配列を反復する方法は?

私はそれをその位置の値と比較します(単純化するために、行列の唯一の部分は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

だから何がそれを修正する最も簡単な方法でしょうか?それはの最初の繰り返しであるかどうかをチェックする必要があり

init = rows*i+j; 

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

答えて

4

+0

ありがとう、これは素晴らしい答えです。 –

2

一つの解決策は、これを適用する(しませアルゴリズムによって)1Dにおける1次元配列と仕事にあなたの2Dアレイ構造を変更することです外側のループ:

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

"O(n²)の代わりにO(n)を使用するとアルゴリズムの複雑さが増します。_"この文は誤解を招くものです。また、2D配列を1Dに変換する時間を費やしたことを忘れてしまった。行列の次元が 'N x N'で' N = 8 'の場合、最悪の場合は2Dの 'O(8²)'になります。最初に1Dに変換すると、それを変換するために 'O(8²)'を実行しています。 '〜'表記(2D: '〜')を使うと、ここで二重の作業ができます。 O(8²) '対1D:'〜2 O(8²) ') – KarelG

+0

@Flown OK!説明ありがとう。 – Calips

+0

@ KarelGアルゴリズムで変換を行うつもりはありませんでしたが、必要でない場合は、2D配列の代わりに1D配列で作業することを提案しました。コメントにも感謝しています。 – Calips

0

はCOL_Xから列の繰り返しのために、あなたの内側のループ(ループを開始しませんが、0番目のインデックス(最初の列)から これはrequired

で与えられたフィールドをカバーします。 0
+0

コード例を提供したり、この回答をコメントにすることができます。 – KarelG

関連する問題