Как проверить, не определено ли size_t -1, где size_t равно 0? - PullRequest
0 голосов
/ 21 июня 2020

Этот вопрос касается границ поиска в глубину, работающего на матрице смежности. Учитывая матрицу смежности:

{1,0,0,1},
{1,1,0,0},
{0,0,0,1},
{1,1,1,1}

У меня есть отлично работающая DFS, например:

typedef std::vector<std::vector<short>> matrix;

void myClass::dfs(short row, short column, std::shared_ptr<matrix> m_visited, const matrix &sky) {
    
    if (m_visited->at(row).at(column) == 1) {
        return;
    }
    m_visited->at(row).at(column) = 1; //Mark the node as visited
    if(row+1 <= sky.size()-1 && sky.at(row+1).at(column) == 1) { //Look horizontally forward
        dfs(row+1, column, m_visited, sky);
    }
    if(row-1 >= 0 && sky.at(row-1).at(column) == 1) { //Look horizontally backward
        dfs(row-1, column, m_visited, sky);
    }
    if(column+1 <= sky.at(0).size()-1 && sky.at(row).at(column+1) == 1) { //Look vertically down
        dfs(row, column+1, m_visited, sky);
    }
    if(column-1 >= 0 && sky.at(row).at(column-1) == 1) { //Look vertically up
        dfs(row, column-1, m_visited, sky);
    }
}

Теперь мне дали явную задачу заменить std::vector<std::vector<short>> matrix с участием std::unordered_set<std::vector<size_t>> matrix

Моя проблема: size_t не имеет знака, поэтому, например, когда row = 0 (где строка имеет тип size_t), row -1 не определено, а (row -1 > 0) оценивается как true в моем компиляторе.

Как я могу проверить, находится ли row -1 все еще в границах моей матрицы смежности, используя size_t?

1 Ответ

1 голос
/ 21 июня 2020

Это простая математика: row - 1 > 0 <=> row > 1 и column - 1 > 0 <=> column > 1. Вы можете заменить

if(row-1 >= 0 && sky.at(row-1).at(column) == 1)

на

if(row >= 1 && sky.at(row-1).at(column) == 1)

и

if(column-1 >= 0 && sky.at(row).at(column-1) == 1)

на

if(column >= 1 && sky.at(row).at(column-1) == 1)

Вам также следует подумать о замене

if(row+1 <= sky.size()-1 && sky.at(row+1).at(column) == 1)

с

if(sky.size() >= 2 && row <= sky.size()-2 && sky.at(row+1).at(column) == 1)

и

if(column+1 <= sky.at(0).size()-1 && sky.at(row).at(column+1) == 1)

с

if(sky.at(row).size() >= 2 && column <= sky.at(row).size()-2 && sky.at(row).at(column+1) == 1)

, чтобы избежать всех видов зацикливания.

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