我有一个CS问题,如下所述:
给出一张纸,其中有一些单元格被切掉,用字符表示('('(cut)或'#'(not cut)),我需要找到会形成多少件。
示例:
##..#####.
.#.#.#....
###..##.#.
..##.....#
.###.#####
以上示例的答案为 5 。
将形成一件作品:
....
.##.
....
将形成两件作品:
....
.#..
..#.
常识建议我找到一种用图表来表示工作表的方法(每个数字符号是一个顶点,如果它们共享一个边,则连接两个顶点)。但是,我不清楚如何做到这一点。我发现有隐式图形(由函数定义的图形返回给定顶点的所有邻居)。像这样的函数在这种情况下实现是微不足道的。
问题是:如何修改DFS算法以在此类图表中查找组件?
答案 0 :(得分:1)
当我们从顶点循环边缘时,我们使用隐式边缘而不是存储边缘。
将顶点表示为二维坐标(row, col)
非常有用。
伪码可以如下:
dRow = [-1, 0, +1, 0]
dCol = [ 0, -1, 0, +1]
...later, when we want to move from vertex (row, col)...
for dir in [0..4):
nRow = row + dRow[dir]
nCol = col + dCol[dir]
if vertex (nRow, nCol) is in rectangle bounds:
try to move from vertex (row, col) to vertex (nRow, nCol)
在经典DFS实现具有类似循环的地方:
for each vertex u in {neighbors of vertex v}:
try to move from vertex v to vertex u