【发布时间】:2020-06-21 12:31:37
【问题描述】:
这个问题涉及对邻接矩阵进行深度优先搜索的边缘。
给定一个邻接矩阵:
{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。
如何使用size_t 测试row -1 是否仍在我的邻接矩阵的边界内?
【问题讨论】:
-
你必须测试
row > 0 -
“未定义”到底是什么意思?整数重载是为无符号类型完美定义的。与签名不同。
-
它不是未定义的。通常是下溢,即row - 1 = size_t::max,远高于0
-
结果肯定不是未定义的。
size_t是一个无符号整数类型,从(size_t)0中减去(size_t)1得到一个完全明确的结果,等于std::numeric_limits<size_t>::max()。std::numeric_limits在标准标头<limits>中。 -
数学很简单:
row - 1 > 0 <=> row > 1
标签: c++ undefined depth-first-search adjacency-matrix size-t