-1

次のグリッドがあるとします。

グリッドのアウトライン 0,0 .. 3,5

左下隅から始まるforループを使用してナビゲートする方法がわかりません。セルの順序は

0,5 => 0,4 => 1,5 => 1,4 => 0,3 => 2,5, => 1,3 => 2,4 => 2,3...

それを視覚化する別の方法:

(1) 0,5 => 
(2) 0,4 => (1,5) (1,4)
(3) 0,3 => (2,5) (1,3) (2,4) (2,3)
(4) 0,2 => (3,5) (1,2) (3,4) (2,2) (3,3) (3,2)

だからここに私が見るパターンがあります:

  1. 各ループを開始するには、前のループの値 (x,y) を取り、それを (x, y-1) にします。
  2. したがって、次のようなパターンが現れます: (+1, y) (x,-1) (+1, y) (x, -1) したがって、古い値を引き出して、x の増加と y の減少を交互に行うことができます。

for ループは、この仕事には不適切なツールですか?

以前の値を取得する必要がなく、それらを計算するだけで済むようにする巧妙なアルゴリズムはありますか? ここで間違ったツリーを吠えていますか?別の方法でアプローチする必要がありますか (正しく?)?

編集:

これは、パスを描画する試みです。これがより意味があるかどうかはわかりません:

ここに画像の説明を入力

アイデアは、最初のセルの左下隅から開始することです。セルを 1 つ上に移動し、直角になるように交互にします。完全な直角が形成されたら、1 つのセルを上に移動し、交互に新しい直角を形成します。

4

1 に答える 1

1

非正方形グリッド用に編集された可能な解決策:

for(startY = maxY, startY >= 0; startY++)
{
    x1 = 0;
    y1 = startY;
    x2 = 5 - startY;
    y2 = 5;

    while(!(x1 == x2 && y1 == y2))
    {
        if(x1 <= maxX)
            //Point 1 is x1, y1

        if(y2 >= 0)
            //Point 2 is x2, y2

        x1++;
        y2--;
    }

    if(x1 <= maxX)
        //Final point is x1, y1
}

そのため、while ループの各反復で 2 つのポイントを計算し、パスのそのセクションの残りのポイントの後に for ループを介して各反復の最後の対角点を計算します。

于 2012-05-28T07:47:01.607 に答える