2017-05-19 8 views
0

私は自分の課題に苦労しており、何か助けが必要です。2次元配列の外側(中心から始まる)と時計回りのCスパイラルトラバーサル

2次元配列A [N] [N](ここでNは自然数で1からN^2までの自然数で満たさなければなりませんが、トラバーサルアルゴリズムは私が苦労しているものです)中心(A [N/2] [N/2])から始まり、らせん状と時計回りに移動すると、奇数(1,3,5,7 ...)になります。

例(N = 5):

25 10 11 12 13 
24 9 2 3 14 
23 8 1 4 15 
22 7 6 5 16 
21 20 19 18 17 

Iパターン参照:中央= 1。 1xUP、1xRIGHT、2xDOWN、2xLEFT、3xUP、​​3xRIGHTなど...

ループでこのアルゴリズムを実装するにはどうすればよいですか? 時間が近づいていて、ここにこだわっています...

いくつかの提案を読んで助けてください。

ありがとうございました!

+0

はい、私はこれを見ましたが、コードを編集して中央から開始し、垂直方向に上に移動し、次に螺旋状に&時計回りに移動するようにしますか?それが闘いです。 編集:インデックス[0] [0](行列の先頭)から始まるスパイラル&時計回りのコードもあります。私は現在、それがインサイドアウトからトラバースするようにそれに取り組んでいます。可能であれば、ここにコードを貼り付けることができます:それを見直す方法を教えてください。 – Waterfalse

+0

また、これには正方形のカーネルを使うこともできます(円形の 'cos、sin'ではなく)。[2D 3 x 3グリッドの回転対角行列を回転させるには?](http://stackoverflow.com/a/40355825/) 2521214)行列の中心から外側の端にループ正方形...同心円のレンダリングに似ています – Spektre

答えて

0

あなたがここに最初のステップの同じ実装および変更の方向を使用することができます:Print 2-D Array in clockwise expanding spiral from center

int x = 0; // current position; x 
int y = 0; // current position; y 
int d = 0; // current direction; 0=RIGHT, 1=DOWN, 2=LEFT, 3=UP 
int c = 0; // counter 
int s = 1; // chain size 

int d - 現在の方向です。 3に変更してください。

+1

ありがとう、@knst! 私は今このようにしています。 正しく動作させるには、いくつかの作業が必要です。私が終わったらここに書きます! – Waterfalse

+0

まあ、私はそうしましたが、残っている唯一の問題は、トラバーサル(座標[0] [0]の要素)の最後の要素に達していないことです。 たとえば、N = 5の場合は、必要に応じて行列を塗りつぶしますが、最後の要素(行列[0] [0])はN^2 = 25ではなくランダムな値をとります。 – Waterfalse

+0

実際にこれらの断片(int j = 0; j <(k <(size-1)?2:3)に対して、 for(int k = 1; k <=(size-1); k ++) { ; j ++) これらは正確に何に使用されていますか? – Waterfalse