矩阵中的深度优先搜索递归

时间:2016-02-13 13:00:55

标签: depth-first-search

http://codeforces.com/contest/540/problem/C

使用矩阵上的深度优先递归解决了这个问题,我得到了这个问题的代码。任何人都可以解释为什么/递归正在这个矩阵上工作?

#include <bits/stdc++.h>
using namespace std;
int a, b, used[600][600];
char c;
void dfs( int x, int y )
{
    used[x][y]++;
    if( used[x][y] >= 3 || x < 1 || y < 1 || x > a || y > b )
        return;
    dfs(x + 1, y);
    dfs(x - 1, y);
    dfs(x, y + 1);
    dfs(x, y - 1);
}
int main()
{
    int i, j;
    cin >> a >> b;
    for( i = 1; i <= a; i++ ){
        for( j = 1; j <= b; j++ ){
            cin >> c;
            if( c == '.' )    used[i][j] = 1;
            else used[i][j] = 2;
         }
     } 
     int x1, y1, x2, y2;
     cin >> x1 >> y1 >> x2 >> y2;
     used[x1][y1] = 1;
     dfs(x1, y1);
     if( used[x2][y2] >= 3 )    cout << "YES";
     else cout << "NO";
} 

1 个答案:

答案 0 :(得分:0)

该问题可以被认为是具有连接相邻的单元(节点)的边缘的图,即共享边界。

使用堆栈结构实现DFS时,更容易看到递归。这里递归以函数调用的形式实现。我们只会为那些节点调用dfs:

directly reachable from the current node we are examining(which are all the cells 
adjacent to (x, y)).

致电 dfs(x, y); 导致呼唤 dfs(x + i, y + j); for(i,j)= {( - 1,0),(0,1),(1,0),(0,-1)}。结果,当时的程序状态字(变量,指令指针等) 调用dfs(x + 1, y),将其隐式推送到程序使用的堆栈内存中。这些调用导致与(x,y)相邻的单元数增加1.

递归展开的时候 if( used[x][y] >= 3 || x < 1 || y < 1 || x > a || y > b )

满足条件导致返回坐标(节点),调用dfs on(x,y)或所有调用 dfs(x + i, y + j) for(i,j)= {(-1,0),(0,1),(1,0),(0,-1)}已将控制权返回给dfs(x,y),即在dfs(x, y - 1)行之后。

当你在dfs(x,y)中调用dfs(x -1,y),dfs(x,y -1)等时,所以递归就到了;