簡単にするために 5x5 グリッドで作業しますが、同じ概念を他のグリッド サイズにも適用できます。
0 に設定します。これは、最初の値から始まるi
1D 配列へのインデックスです。int values[25]
x
0 と4 に設定しy
ます。これらは 2Dint grid[5][1]
配列へのインデックスで、左下隅から始まり、塗りつぶしの前方移動を制御します。
1 に設定direction
します。これは、塗りつぶしの横方向の動きを制御して、反復ごとにインクリメントされるx
数値です。y
i
0 から 24 までループします。反復ごとに、 にコピーvalues[i]
しgrid[x][y]
、次に をインクリメントx
しy
てdirection
、いくつかの条件をチェックします。
- 4x4 (右下隅) を超えている場合は、1 と 2 を減らし
x
て-1を掛けます。y
x
y
direction
- それ以外の場合、
x
およびy
0x0 (左上隅) を超えている場合は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 とy
2ずつ減分し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...
結果:

10x10 は次のとおりです。

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

3x7:

10x1:

1x10:
