这个问题涉及在邻接矩阵上运行的深度优先搜索的边缘.
给定邻接矩阵:
{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
withstd::unordered_set<std::vector<size_t>> matrix
的明确任务
我的问题:size_t
是无符号的,所以例如当row = 0
(其中行的类型为size_t
(,row -1
是未定义的,并且(row -1 > 0)
在我的编译器上计算为true。
如何使用size_t
测试row -1
是否仍在邻接矩阵的边界内?
这是简单的数学: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)
以避免各种环绕。