проверка соседних элементов элемента 2D-массива без повторения элемента более одного раза - PullRequest
0 голосов
/ 13 июня 2019

скажем, у меня есть 2D-массив, размер 5X5. для каждого элемента я хочу проверить соседние элементы, используя специальную функцию, которую я сделал для проверки «мин». как я могу проверить соседние элементы только один раз (то есть, чтобы не проверять их снова, когда я перехожу к следующему элементу, в котором некоторые из «последних соседей» все еще являются соседями нового элемента) (в качестве фона я также предоставлю » функция isValid и isMine). (конечно, это только часть кода, который я знаю обо всем процессе инициации и т. д.)

// A Utility Function to check whether given cell (row, col) 
// has a mine or not. 
bool isMine (int row, int col, char board[][MAXSIDE]) 
{ 
    if (board[row][col] == '*') 
        return (true); 
    else
        return (false); 
} 

// A Utility Function to check whether given cell (row, col) 
// is a valid cell or not 
bool isValid(int row, int col) 
{ 
    // Returns true if row number and column number 
    // is in range 
    return (row >= 0) && (row < SIDE) && 
           (col >= 0) && (col < SIDE); 
} 



 if (isValid (row-1, col) == true) 
            { 
                   if (isMine (row-1, col, realBoard) == false) 
                   playMinesweeperUtil(myBoard, realBoard, mines, row-1, col, movesLeft); 
            } 

            //----------- 2nd Neighbour (South) ------------ 

            // Only process this cell if this is a valid one 
            if (isValid (row+1, col) == true) 
            { 
                   if (isMine (row+1, col, realBoard) == false) 
                    playMinesweeperUtil(myBoard, realBoard, mines, row+1, col, movesLeft); 
            } 

            //----------- 3rd Neighbour (East) ------------ 

            // Only process this cell if this is a valid one 
            if (isValid (row, col+1) == true) 
            { 
                if (isMine (row, col+1, realBoard) == false) 
                    playMinesweeperUtil(myBoard, realBoard, mines, row, col+1, movesLeft); 
            } 

            //----------- 4th Neighbour (West) ------------ 

            // Only process this cell if this is a valid one 
            if (isValid (row, col-1) == true) 
            { 
                   if (isMine (row, col-1, realBoard) == false) 
                    playMinesweeperUtil(myBoard, realBoard, mines, row, col-1, movesLeft); 
            } 

            //----------- 5th Neighbour (North-East) ------------ 

            // Only process this cell if this is a valid one 
            if (isValid (row-1, col+1) == true) 
            { 
                if (isMine (row-1, col+1, realBoard) == false) 
                    playMinesweeperUtil(myBoard, realBoard, mines, row-1, col+1, movesLeft); 
            } 

             //----------- 6th Neighbour (North-West) ------------ 

            // Only process this cell if this is a valid one 
            if (isValid (row-1, col-1) == true) 
            { 
                 if (isMine (row-1, col-1, realBoard) == false) 
                    playMinesweeperUtil(myBoard, realBoard, mines, row-1, col-1, movesLeft); 
            } 

             //----------- 7th Neighbour (South-East) ------------ 

            // Only process this cell if this is a valid one 
            if (isValid (row+1, col+1) == true) 
            { 
                   if (isMine (row+1, col+1, realBoard) == false) 
                    playMinesweeperUtil(myBoard, realBoard, mines, row+1, col+1, movesLeft); 
            } 

            //----------- 8th Neighbour (South-West) ------------ 

            // Only process this cell if this is a valid one 
            if (isValid (row+1, col-1) == true) 
            {

1 Ответ

1 голос
/ 13 июня 2019

как я могу проверить соседние элементы только один раз (т.е. не проверьте их еще раз, когда я перейду к следующему элементу, в котором некоторые из «последние соседи» остаются соседями нового элемента)

Чтобы сделать буквально то, что вы описываете, вам понадобится какая-то структура данных, в которой можно было бы записать количество каждой ячейки на доске. Но у вас уже есть в виде самой платы. Добавление другой структуры данных будет означать, что вы проверяете эту структуру данных вместо проверки платы, плюс вам нужно будет реализовать логику для выбора источника данных для тестирования. Если было бы дорого проверять минируемость ваших клеток, то, возможно, имело бы смысл предпринять такие усилия, но это не ваш случай.

Если, скажем, вы делаете что-то вроде подсчета количества мин, соседствующих с каждой ячейкой, то вы могли бы рассмотреть возможность вывернуть проблему наизнанку: начните с установки счетчика мин-соседей каждой ячейки на ноль, а затем отсканируйте доску для шахт, и каждый раз, когда вы найдете один, увеличивайте счет каждого из его соседей. Если у двух или более мин есть общий сосед, вы все равно будете касаться этого соседа несколько раз, но если количество мин меньше, чем количество неразминированных ячеек, вы можете увидеть некоторое улучшение.

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