3

したがって、4x4 の 2D 配列があります (常にこれらの次元になります)。配列上の位置から始めて、いくつかの行と列から、その有効な隣人をすべて見つけたいと考えています。これまでのところ、私は本当にぎこちない実装をしています。

//add row
    if ( !((row + 1) > 3)) {
        //do stuff
    }
    //sub row
    if ( !((row - 1) < 0)) {
        //do stuff
    }
    //add col
    if ( !((col + 1) > 3)) {
        //do stuff
    }
    //sub col
    if ( !((col - 1) < 0)) {
        //do stuff
    }
... and so on

これは残忍です。要素の位置を知ることから始めると、すべての隣人をチェックする必要はないように感じます。何か案は?

4

7 に答える 7

3

cellValues[][]以下の次元の任意の 2D 配列では、(x,y)コードを使用して任意の cell の 8 つの隣接要素すべてを取得できます(i,j)。コードは0デフォルトで返されます。

public static ArrayList<Integer> getNeighbors(int i, int j, int x, int y, int[][] cellValues) {
    ArrayList<Integer> neighbors = new ArrayList<>();

    if(isCabin(i, j, x, y)) {
        if(isCabin(i + 1, j, x, y))
            neighbors.add(cellValues[i+1][j]);
        if(isCabin(i - 1, j, x, y))
            neighbors.add(cellValues[i-1][j]);
        if(isCabin(i, j + 1, x, y))
            neighbors.add(cellValues[i][j+1]);
        if(isCabin(i, j - 1, x, y))
            neighbors.add(cellValues[i][j-1]);
        if(isCabin(i - 1, j + 1, x, y))
            neighbors.add(cellValues[i-1][j+1]);
        if(isCabin(i + 1, j - 1, x, y))
            neighbors.add(cellValues[i+1][j-1]);
        if(isCabin(i + 1, j + 1, x, y))
            neighbors.add(cellValues[i+1][j+1]);
        if(isCabin(i - 1, j - 1, x, y))
            neighbors.add(cellValues[i-1][j-1]);
    }
    return neighbors;
}

public static boolean isCabin(int i, int j, int x, int y) {
    boolean flag = false;
    if (i >= 0 && i <= x && j >= 0 && j <= y) {
        flag = true;
    }
    return flag; 
}
于 2016-09-15T00:13:01.497 に答える
2

[x,y]これを行う方法は次のとおりです。任意の点が与えられ、任意の配列サイズに一般化された、有効な近傍の x、y ペアのリストを取得するメソッド:

public List<int[]> getNeighbors(x, y, maxX, maxY) {
    neighbors = new ArrayList<int[]>;
    if x > 0:
        neighbors.add({x-1, y});
    if y > 0:
        neighbors.add({x, y-1});
    if x < maxX:
        neighbors.add({x+1, y});
    if x < maxY:
        neighbors.add({x, y+1});
    return neighbors;
}

[...]

for (int[] coords : getNeighbors(x, y, 4, 4)) {
    // do stuff
}
于 2013-10-19T00:22:25.257 に答える
2

残念ながら、コードを書くということは、コンピューターに何をすべきかを伝えることであり、コンピューターはあなたが指示したこと以上のことを知りません。

この種のことは、非標準のループロジックで少し自動化できますが、私は推測します:

for (int coff = -1; coff < 3; coff += 2) {
    for (int roff = -1; roff < 3; roff += 2) {

        if (    col + coff >= 0 &&
                col + coff < array.length &&
                row + roff >= 0 &&
                row + roff < array[row].length) {

            // do stuff with array[col + coff][row + roff]

        }
    }
}

そのループ構造は、列と行のオフセットを -1 から 1 に反転し、3 回目の反復で 3 になると壊れます。

ただし、コードで !(stuff) > 4 をチェックすると、最後のインデックスが 4 - 1 であることを覚えているため、ArrayIndexOutOfBounds 例外が発生することに注意してください。

于 2013-10-19T00:23:11.137 に答える
2

有効な隣人を構成するものは何ですか?

配列の境界 (対角線を含む) 内のセルのすべての隣接セルを取得することだけが必要な場合は、これで十分です。

public List<Element> getNeighbors( int x, int y ) {
    List<Element> neighbors = new ArrayList<>();

    for( int i = -1; i <= 1; ++i ) {
        for( int j = -1; j <= 1; ++j ) {
            if( i == 0 && j == 0 ) {
                continue;
            }
            if( i + x >= 0 && i + x < array.length &&
                j + y >= 0 && j + y < array[0].length ) {
                    // we found a valid neighbor!
                    neighbors.add( array[i][j] );
            }
        }
    }

    return neighbors;
}
于 2013-10-19T00:27:04.733 に答える
0
public class FindingNeighboursInMatrix {

public static void main(String[] args) {
    int array[][] = { { 1, 2, 3, 4 }, 
                      { 5, 6, 7, 8 }, 
                      { 9, 10, 11, 12 } };

    for (int i = 0; i < array.length; i++) {

        for (int j = 0; j < array[0].length; j++) {

            System.out.println("neightbours of " + array[i][j]);
            int neb[] = findneighbours(i, j, array);
            for (int k = 0; k < neb.length; k++) {
                if (neb[k] != -1) {
                    System.out.print(" " + neb[k] + ",");
                }
            }
            System.out.println();
        }

    }

}

public static int[] findneighbours(int i, int j, int matrix[][]) {
    int neb[] = new int[8];
    // top row
    neb[0] = getvalue(i - 1, j - 1, matrix);
    neb[1] = getvalue(i - 1, j, matrix);
    neb[2] = getvalue(i - 1, j + 1, matrix);

    // left element

    neb[3] = getvalue(i, j - 1, matrix);

    // right element

    neb[4] = getvalue(i, j + 1, matrix);

    // bottom row
    neb[5] = getvalue(i + 1, j - 1, matrix);
    neb[6] = getvalue(i + 1, j, matrix);
    neb[7] = getvalue(i + 1, j + 1, matrix);

    return neb;

}

public static int getvalue(int i, int j, int matrix[][]) {
    int rowSize = matrix.length;
    int colSize = matrix[0].length;

    if (i < 0 || j < 0 || i > rowSize - 1 || j > colSize - 1) {
        return -1;
    }
    return matrix[i][j];
}}
于 2016-07-05T06:43:16.493 に答える