helloThere555 Ответов: 1

Как найти элементы, наиболее близкие к заданному элементу 2D-массива?


Привет,

Скажем, у меня есть 2D-массив, который мы используем, например, в качестве игровой доски.

Например, 2D-массив 5x5 типа char, инициализированный точками и буквой "S".

char[][] array = new char[5][5]


.....
.....
..С..
.....
.....

Как я могу найти индексы 2D-массива, которые находятся ближе всего к букве S (она же обертка вокруг нее), с точки зрения близости на доске, а затем превратить это в новый массив?

Таким образом, в этом примере 8 точек, окружающих S, теперь могут быть инициализированы в новый массив.


Что я уже пробовал:

Я попытался найти Евклидово расстояние между данной точкой и элементами массива, которые ее окружают, а затем прикрепить объекты этого массива к длине с помощью хэш-карты. Обратите внимание, что приведенный выше вопрос больше для простоты, и мой фактический проект работает с 2D-массивами пользовательского типа, что видно из приведенного ниже кода. Тем не менее, эта концепция все еще применима.


public static void getIndexes(Grid_23722002 grid, Piece_23722002 piece){

        int row = piece.getRow();
        int col = piece.getCol();

        Piece_23722002[][] nhood = new Piece_23722002[8][8];
        Map<Piece_23722002, Integer> unsortedLengthMap = new LinkedHashMap<Piece_23722002, Integer>();

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

            for (int j =0; j < grid.getArrayForm()[i].length; j++){

                unsortedLengthMap.put(piece, grid.getArrayForm()[i][j].getLengthToPoint(grid, i, j, piece));

            }

        }

        Map<Piece_23722002, Integer> sortedLengthMap = new LinkedHashMap<Piece_23722002, Integer>();
        unsortedLengthMap.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue())
                .forEachOrdered(x -> sortedLengthMap.put(x.getKey(), x.getValue()));


    }

    public int getLengthToPoint(Grid_23722002 grid, int i, int j, Piece_23722002 piece){

        int piecesRow = piece.getRow();
        int piecesCol = piece.getCol();

        int length = (int) Math.sqrt(Math.pow(grid.getArrayForm()[i][j].getRow() - piecesRow, 2) + Math.pow(grid.getArrayForm()[i][j].getCol() - piecesCol, 2));

        return length;

    }

1 Ответов

Рейтинг:
8

Gerry Schmitz

Если у вас есть "точка" (x,y) в 2D-массиве, то вокруг первой точки может быть "до" 8 точек (меньше, если первая точка находится на "краю" массива).

Вы определяете "соседей" для x,y следующим образом:

n = x, y+1
s = x, y-1
e = x+1, y
w = x-1, y
ne = x+1, y+1
nw = x-1, y+1
и т.д.

Если какой-либо вычисленный x или y меньше 0 или больше верхней границы массива, то вычисленная точка находится "вне доски".

Я использую "класс" для очков в своей игре; и сделал "соседей" детьми каждой точки, поэтому я делаю эти конкретные вычисления только один раз.

(Для "пограничных точек" я все еще делаю вычисления, но использую "фиктивную" точку для представления точки вне массива ... просто все становится проще. Итак, если ваше требование равно 5x5, используйте 7x7 и зарезервируйте внешние точки для "out of bounds")