1

nxn行列のすべての境界セルを処理したいと思います。たとえば、int array[5][5]; アルゴリズムはすべてのx要素を処理する必要があるため、形式は次のとおりです。

   x x x x x 
   x - - - x
   x - - - x
   x - - - x
   x x x x x

この細胞を処理する最良の方法は何ですか? 3 次元配列の場合はどうでしょうか。事前に感謝します。マトリックス表現で申し訳ありません。

編集 Iループのネストや再帰を避けるために、ループを 1 つだけ使用したいと思います。

4

2 に答える 2

1

各要素に触れるとコストがかかり、境界要素のみに触れたいと想像してください。

明らかに、これは一般的な最適化ではありません。しかし、画像処理では、これで良いパフォーマンスが得られました。つまり、それは場合によって異なります。あなたのケースでテストして決定してください。

2D 配列ではptr、マトリックスにポイントを作成し、段階的に進行させることができます。

void process(char i)
{
    cout << i;
}

int main()
{
    const int N = 5;
    char mat[N][N] = {
        {'a', 'b', 'c', 'd', 'e'},
        {'f', '-', '-', '-', 'g'},
        {'h', '-', '-', '-', 'i'},
        {'j', '-', '-', '-', 'k'},
        {'l', 'm', 'n', 'o', 'p'}
    };

    char *ptr = (char*) mat;

    for (int i = 0; i < N - 1; ++i) // Process first row
        process(*ptr++);

    for (int i = 0; i < N - 2; ++i) // Process column borders
    {
        process(*ptr);
        process(*(ptr + 1));
        ptr += N;
    }

    for (int i = 0; i <= N; ++i)    // Process last row
        process(*ptr++);

    cout << endl;
}

出力:

abcdefghijklmnop

于 2013-03-23T17:01:36.480 に答える
-1

基本的に、配列内のすべての次元の場合を処理したいと考えていindex == 0ます。が処理関数であり、 int 引数を取るindex == sizeと仮定します。process()

void processNXNBorders(int** twoDArray, int dimonesize, int dimtwosize) {
    for (int i = 0; i < dimonesize; i++) {
        if (i == 0 || i == dimonesize-1) {
            // Process entire row
            for (int j = 0; j < dimtwosize; j++) {
                 process(twoDArray[i][j]);
            }
        } else {
            // Only first and last elements in this row.
            process(twoDArray[i][0]);
            process(twoDArray[i][dimtwosize-1]);
        }
    }
}

したがって、5x5 配列の場合、呼び出しは次のようになります。

processNXNBorders(arr, 5, 5);
于 2013-03-23T16:42:00.853 に答える