0

重複の可能性:
らせん状にループする らせん状
に文字列を書く らせん状に
2 次元配列を出力する らせん状に配列
する

行列の形のデータがあります

0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0

この方法で1次元配列に格納されます

[0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0]

これは、5x5 に変換されたゼロ パディングされた 3x3 配列です。開始インデックスと終了インデックスはわかっています。

ご覧のとおり、25 の操作を実行してすべての値を出力できますが、代わりにらせん状の順序で実行する場合は、理想的には 9 回の操作でこれを行う必要があります。

誰もこれを行う方法を知っていますか?

行数と列数はわかっています。ここでは、rows=5 cols=5 になります。

したがって、開始インデックスは行 + 1 になり、終了インデックスは行 * 列 -6 になります。

スパイラルオーダートラバーサルとして視覚化しています。

4

2 に答える 2

0

5x5インデックスベースがゼロであると仮定したマトリックスを考えると、行インデックスは次のようになります。
0,1,2,3,4
5,6,7,8,9
10,11,12,13,14
15,16,17,18,19
20,21,22,23,24

最初のインデックスは6で、最後のインデックスは です18。したがって、出発点として、マトリックスの次の部分を削除できることがわかっています。

0,1,2,3,4

19,20,21,22,23,24,25

これは操作としてカウントされ2ます。

6また、 index から開始していて、 3x3index に移動するだけでよいこともわかっています8。これは 1 つの操作です。

次に、この利回り5の以前のインデックスに追加して、再度続行する必要があります (合計操作数) 現在の操作数は) 61125

でこれをもう一度行うと、1 つの操作11が得られます16。さらに 2 つの操作を取得すると、結果は になります18。これで合計 8 回の操作になりました。

于 2013-01-11T19:29:11.067 に答える
0

私はこのようなことをします:

   POINT ul = (start_idx/width, start_idx%width);
   POINT br = (end_idx/width, end_idx%width);
   POINT p = ul
   dir = RIGHT;
   while (ul != br)
     visit(ARRAY[p.x+p.y*WIDTH])
     case dir
        when RIGHT:   
           p.x+=1
           if (p.x==br.x) 
             dir = DOWN
             ul.y++;
         when DOWN
           p.y+=1
           if (p.y==br.y) 
             dir = LEFT
             br.x--;
         when LEFT: 
            //like RIGHT but -1 and adjust br.y upwards when done
         when UP:
            //like DOWN but -1 and adjust ul.x rightward when done
    endwhile

アイデアは、訪問する仮想 x と y を追跡することです。始点と終点で定義されたボックスの側面に沿って訪問するポイントを移動します。訪問を完了すると、側面を内側に調整します。

于 2013-01-11T19:57:19.487 に答える