1

私は、セルラー オートマトン メソッドを含むプロジェクトに取り組んでいます。私が理解しようとしているのは、2次元配列内のすべての隣人を見つけるのに役立つ関数を書く方法です。たとえば、サイズ x サイズの 2 次元配列 [ここではサイズ = 4] があります。

[x][n][ ][n]
[n][n][ ][n]
[ ][ ][ ][ ]
[n][n][ ][n]

x [0,0 インデックス] とマークされたフィールドには、[n] とマークされた近傍があります -> 8 つの近傍。私がやろうとしているのは、何千ものifステートメントを書いている隣人を見つけることができる関数を書くことです

誰もそれを行う方法を知っていますか? ありがとう

4

3 に答える 3

1

可能なすべての順列で、座標から 1 を加算および減算します。-1境界外の結果は折り返されます (例: become34become 0)。基本的には、いくつかの単純なループが必要です。

何かのようなもの

// Find the closest neighbours (one step) from the coordinates [x,y]
// The max coordinates is max_x,max_y
// Note: Does not contain any error checking (for valid coordinates)
std::vector<std::pair<int, int>> getNeighbours(int x, int y, int max_x, int max_y)
{
    std::vector<std::pair<int, int>> neighbours;

    for (int dx = -1; dx <= 1; ++dx)
    {
        for (int dy = -1; dy <= 1; ++dy)
        {
            // Skip the coordinates [x,y]
            if (dx == 0 && dy == 0)
                continue;

            int nx = x + dx;
            int ny = y + dy;

            // If the new coordinates goes out of bounds, wrap them around
            if (nx < 0)
                nx = max_x;
            else if (nx > max_x)
                nx = 0;

            if (ny < 0)
                ny = max_y;
            else if (ny > max_y)
                ny = 0;

            // Add neighbouring coordinates to result
            neighbours.push_back(std::make_pair(nx, ny));
        }
    }

    return neighbours;
}

使用例:

auto n = getNeighbours(0, 0, 3, 3);
for (const auto& p : n)
    std::cout << '[' << p.first << ',' << p.second << "]\n";

プリントアウト

[3,3]
[3,0]
[3,1]
[0,3]
[0,1]
[1,3]
[1,0]
[1,1]

これが正解です。

于 2013-09-23T16:50:25.103 に答える
1

あなたが cell にいるとします(i, j)。次に、無限グリッドでは、隣人は になります[(i-1, j-1), (i-1,j), (i-1, j+1), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j), (i+1, j+1)]

ただし、グリッドは有限であるため、上記の値の一部は範囲外になります。しかし、剰余算術は知っています:4 % 3 = 1-1 % 3 = 2. したがって、グリッドのサイズが適切である場合は、上記のリストn, mに適用するだけ%n, %mで適切な隣接リストを取得できます。[((i-1) % n, (j-1) % m), ((i-1) % n,j), ((i-1) % n, (j+1) % m), (i, (j-1) % m), (i, (j+1) % m), ((i+1) % n, (j-1) % m), ((i+1) % n, j), ((i+1) % n, (j+1) % m)]

あなたの座標が と の間 と の間である場合、それはうまく0いきます。から始める場合は、 aと a をどこかで実行して、上記を微調整する必要があります。n0m1-1+1

あなたの場合n=m=4(i, j) = (0, 0). 最初のリストは[(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]. モジュラス演算を適用すると、写真で[(3, 3), (3, 0), (3, 1), (0, 3), (0, 1), (1, 3), (1, 0), (1, 1)]マークされた正方形が正確になり[n]ます。

于 2013-09-23T16:50:57.793 に答える