Посещение соседа позиции в 2d-массиве - PullRequest
0 голосов
/ 26 апреля 2010

У меня есть следующий двумерный массив:

static int[,] arr = new int[5, 5] 
{ 
    { 00, 00, 00, 01, 00 },
    { 00, 00, 01, 01, 00 },
    { 00, 00, 01, 01, 00 },
    { 00, 00, 01, 01, 00 },
    { 00, 00, 00, 01, 00 },
};

Я должен реализовать метод Hit (int x, int y). Когда мы достигаем 0 в массиве (то есть Hit (0, 0), Hit (1, 1), но не Hit (3, 0)), я бы хотел, чтобы все соседние нули, к которым мы ударили, были увеличены на 10 Поэтому, если я вызову Hit (1, 1), массив должен стать следующим.

static int[,] arr = new int[5, 5] 
{ 
    { 10, 10, 10, 01, 00 },
    { 10, 10, 01, 01, 00 },
    { 10, 10, 01, 01, 00 },
    { 10, 10, 01, 01, 00 },
    { 10, 10, 10, 01, 00 },
};

Есть идеи, как мне это реализовать? Для меня это звучит так, как будто алгоритм «Поиск в глубину» / «Рекурсивный сорт» должен выполнить эту работу, но я не смог реализовать его для 2d-массива.

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 26 апреля 2010

Вы ищете алгоритм Flood fill , который вы можете реализовать различными способами, от DFS (просмотр стека) до BFS .

Вы также можете немного сжать код, но вот грубый набросок того, что я бы сделал (с DFS):

int[] dx = { 1, 1, 1, 0, 0, -1, -1, -1 };
int[] dy = { 1, 0, -1, 1, -1, 1, -1, 0 };
void Hit( int x, int y ) {
    if ( board[x,y] == 0 ) {
        board[x,y] = 10;
        for ( int i = 0; i < 8; i++ ) {
            nx = x + dx[i];
            ny = y + dy[i];

            // if nx, ny is in bound
            if ( nx >= 0 && nx < height && ny >= 0 && ny < height )
                Hit( nx, ny );
        }
    }
}
1 голос
/ 26 апреля 2010

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

Что-то вроде

    private void Hit(int[,] arr, int x, int y)
    {
        if (    
                x < 0 ||
                x + 1 > arr.GetLongLength(0)||
                y < 0 ||
                y + 1 > arr.GetLongLength(1)
            )
            return;
        if (arr[x, y] == 0)
        {
            arr[x, y] += 10;
            Hit(arr, x, y + 1);
            Hit(arr, x + 1, y + 1);
            Hit(arr, x + 1, y);
            Hit(arr, x + 1, y - 1);
            Hit(arr, x, y - 1);
            Hit(arr, x - 1, y - 1);
            Hit(arr, x - 1, y);
        }
    }
0 голосов
/ 26 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...