0

私のコードの一部:

int y[1000];
//Generation of array

void __fastcall TForm1::Button2Click(TObject *Sender){
 Memo2->Clear();
 for (int i=0;i<100;i++){
  y[i]=rand()%1000;
  Memo2->Lines->Add(IntToStr(y[i]));
 }
}

タスクは、2 次元の 10x10 配列を作成し、以下のように StringGrid を埋めることです。これを行うための適切なアルゴリズムが見つかりません。誰かアドバイスをいただけますか?

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

1 に答える 1

0

簡単にするために 5x5 グリッドで作業しますが、同じ概念を他のグリッド サイズにも適用できます。

0 に設定します。これは、最初の値から始まるi1D 配列へのインデックスです。int values[25]

x0 と4 に設定しyます。これらは 2Dint grid[5][1]配列へのインデックスで、左下隅から始まり、塗りつぶしの前方移動を制御します。

1 に設定directionします。これは、塗りつぶしの横方向の動きを制御して、反復ごとにインクリメントされるx数値です。y

i0 から 24 までループします。反復ごとに、 にコピーvalues[i]grid[x][y]、次に をインクリメントxydirection、いくつかの条件をチェックします。

  • 4x4 (右下隅) を超えている場合は、1 と 2 を減らしxて-1を掛けます。yxydirection
  • それ以外の場合、xおよびy0x0 (左上隅) を超えている場合はx、2 と 1 ずつインクリメントし、-1yを乗算directionします。
  • それ以外の場合yは、4 (下端) を超えている場合は、1 を減らしyて -1 を掛けdirectionます。
  • それ以外の場合xは、0 (左端) を超えている場合は、1 を増やして -1xを掛けます。direction
  • それ以外の場合yは、0 (上端) を超えている場合はx、2 と 1 ずつインクリメントし、-1yを掛けdirectionます。
  • それ以外の場合xは、4 (右端) を超えている場合はx、1 とy2ずつ減分しdirection、-1 を乗算します。

最終的に最終コーナーに到達すると、ループはコピーする値を使い果たします。

コードは最終的に次のようになります (これは、私が掘り下げるよりも高度な数学で単純化できると確信しています)。

const int numX = 5;
const int numY = 5;
const int numValues = numX * numY;

int grid[numX][numY];
int values[numValues];

for(int i = 0; i < numValues; ++i)
{
    // for demo purposes...
    values[i] = i+1;//rand()%1000
}

int x = 0;
int y = numY-1;
int dir = 1;

for(int i = 0; i < numValues; ++i)
{
    grid[x][y] = values[i];

    x += dir;
    y += dir;

    if ((x >= 0) && (x < numX))
    {
        if (y < 0)
        {
            x += 2;
            y += 1;
        }
        else if (y >= numY)
        {
            y -= 1;
        }
        else
            continue;
    }

    else if ((y >= 0) && (y < numY))
    {
        if (x < 0)
        {
            x += 1;
        }
        else // x >= numX
        {
            x -= 1;
            y -= 2;
        }
    }

    else if ((x >= numX) && (y >= numY))
    {
        x -= 1;
        y -= 2;
    }

    else // (x < 0) && (y < 0)
    {
        x += 2;
        y += 1;
    }

    dir = -dir;
}

// use grid as needed...

結果:

5x5

10x10 は次のとおりです。

10x10

と のさまざまな値をいじってみましょnumXnumY。それらは同じ値である必要はありません。0 を超えるだけです。たとえば、次のようになります。

11x2:
11x2

3x7:
3x7

10x1:
10x1

1x10:
1x10

于 2015-05-13T05:19:33.097 に答える